sdcard.c 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160
  1. /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
  2. * File Name : sdcard.c
  3. * Author : MCD Application Team
  4. * Version : V2.0.3
  5. * Date : 09/22/2008
  6. * Description : This file provides all the SD Card driver firmware
  7. * functions.
  8. ********************************************************************************
  9. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  10. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
  11. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  12. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
  13. * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
  14. * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  15. *******************************************************************************/
  16. /* Includes ------------------------------------------------------------------*/
  17. #include "sdcard.h"
  18. /* Private typedef -----------------------------------------------------------*/
  19. /* Private define ------------------------------------------------------------*/
  20. #define NULL 0
  21. #define SDIO_STATIC_FLAGS ((u32)0x000005FF)
  22. #define SDIO_CMD0TIMEOUT ((u32)0x00002710)
  23. #define SDIO_FIFO_Address ((u32)0x40018080)
  24. /* Mask for errors Card Status R1 (OCR Register) */
  25. #define SD_OCR_ADDR_OUT_OF_RANGE ((u32)0x80000000)
  26. #define SD_OCR_ADDR_MISALIGNED ((u32)0x40000000)
  27. #define SD_OCR_BLOCK_LEN_ERR ((u32)0x20000000)
  28. #define SD_OCR_ERASE_SEQ_ERR ((u32)0x10000000)
  29. #define SD_OCR_BAD_ERASE_PARAM ((u32)0x08000000)
  30. #define SD_OCR_WRITE_PROT_VIOLATION ((u32)0x04000000)
  31. #define SD_OCR_LOCK_UNLOCK_FAILED ((u32)0x01000000)
  32. #define SD_OCR_COM_CRC_FAILED ((u32)0x00800000)
  33. #define SD_OCR_ILLEGAL_CMD ((u32)0x00400000)
  34. #define SD_OCR_CARD_ECC_FAILED ((u32)0x00200000)
  35. #define SD_OCR_CC_ERROR ((u32)0x00100000)
  36. #define SD_OCR_GENERAL_UNKNOWN_ERROR ((u32)0x00080000)
  37. #define SD_OCR_STREAM_READ_UNDERRUN ((u32)0x00040000)
  38. #define SD_OCR_STREAM_WRITE_OVERRUN ((u32)0x00020000)
  39. #define SD_OCR_CID_CSD_OVERWRIETE ((u32)0x00010000)
  40. #define SD_OCR_WP_ERASE_SKIP ((u32)0x00008000)
  41. #define SD_OCR_CARD_ECC_DISABLED ((u32)0x00004000)
  42. #define SD_OCR_ERASE_RESET ((u32)0x00002000)
  43. #define SD_OCR_AKE_SEQ_ERROR ((u32)0x00000008)
  44. #define SD_OCR_ERRORBITS ((u32)0xFDFFE008)
  45. /* Masks for R6 Response */
  46. #define SD_R6_GENERAL_UNKNOWN_ERROR ((u32)0x00002000)
  47. #define SD_R6_ILLEGAL_CMD ((u32)0x00004000)
  48. #define SD_R6_COM_CRC_FAILED ((u32)0x00008000)
  49. #define SD_VOLTAGE_WINDOW_SD ((u32)0x80100000)
  50. #define SD_HIGH_CAPACITY ((u32)0x40000000)
  51. #define SD_STD_CAPACITY ((u32)0x00000000)
  52. #define SD_CHECK_PATTERN ((u32)0x000001AA)
  53. #define SD_VOLTAGE_WINDOW_MMC ((u32)0x80FF8000)
  54. #define SD_MAX_VOLT_TRIAL ((u32)0x0000FFFF)
  55. #define SD_ALLZERO ((u32)0x00000000)
  56. #define SD_WIDE_BUS_SUPPORT ((u32)0x00040000)
  57. #define SD_SINGLE_BUS_SUPPORT ((u32)0x00010000)
  58. #define SD_CARD_LOCKED ((u32)0x02000000)
  59. #define SD_CARD_PROGRAMMING ((u32)0x00000007)
  60. #define SD_CARD_RECEIVING ((u32)0x00000006)
  61. #define SD_DATATIMEOUT ((u32)0x000FFFFF)
  62. #define SD_0TO7BITS ((u32)0x000000FF)
  63. #define SD_8TO15BITS ((u32)0x0000FF00)
  64. #define SD_16TO23BITS ((u32)0x00FF0000)
  65. #define SD_24TO31BITS ((u32)0xFF000000)
  66. #define SD_MAX_DATA_LENGTH ((u32)0x01FFFFFF)
  67. #define SD_HALFFIFO ((u32)0x00000008)
  68. #define SD_HALFFIFOBYTES ((u32)0x00000020)
  69. /* Command Class Supported */
  70. #define SD_CCCC_LOCK_UNLOCK ((u32)0x00000080)
  71. #define SD_CCCC_WRITE_PROT ((u32)0x00000040)
  72. #define SD_CCCC_ERASE ((u32)0x00000020)
  73. /* Following commands are SD Card Specific commands.
  74. SDIO_APP_CMD should be sent before sending these commands. */
  75. #define SDIO_SEND_IF_COND ((u32)0x00000008)
  76. #define SDIO_INIT_CLK_DIV ((u8)0xB2)
  77. #define SDIO_TRANSFER_CLK_DIV ((u8)0x1)
  78. /* Private macro -------------------------------------------------------------*/
  79. /* Private variables ---------------------------------------------------------*/
  80. static u32 CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1;
  81. static u32 CSD_Tab[4], CID_Tab[4], RCA = 0;
  82. static u32 DeviceMode = SD_DMA_MODE;
  83. static u32 TotalNumberOfBytes = 0, StopCondition = 0;
  84. u32 *SrcBuffer, *DestBuffer;
  85. volatile SD_Error TransferError = SD_OK;
  86. vu32 TransferEnd = 0;
  87. vu32 NumberOfBytes = 0;
  88. SDIO_InitTypeDef SDIO_InitStructure;
  89. SDIO_CmdInitTypeDef SDIO_CmdInitStructure;
  90. SDIO_DataInitTypeDef SDIO_DataInitStructure;
  91. /* Private function prototypes -----------------------------------------------*/
  92. static SD_Error CmdError(void);
  93. static SD_Error CmdResp1Error(u8 cmd);
  94. static SD_Error CmdResp7Error(void);
  95. static SD_Error CmdResp3Error(void);
  96. static SD_Error CmdResp2Error(void);
  97. static SD_Error CmdResp6Error(u8 cmd, u16 *prca);
  98. static SD_Error SDEnWideBus(FunctionalState NewState);
  99. static SD_Error IsCardProgramming(u8 *pstatus);
  100. static SD_Error FindSCR(u16 rca, u32 *pscr);
  101. static u8 convert_from_bytes_to_power_of_two(u16 NumberOfBytes);
  102. static void GPIO_Configuration(void);
  103. static void DMA_TxConfiguration(u32 *BufferSRC, u32 BufferSize);
  104. static void DMA_RxConfiguration(u32 *BufferDST, u32 BufferSize);
  105. /* Private functions ---------------------------------------------------------*/
  106. /*******************************************************************************
  107. * Function Name : SD_Init
  108. * Description : Initializes the SD Card and put it into StandBy State (Ready
  109. * for data transfer).
  110. * Input : None
  111. * Output : None
  112. * Return : SD_Error: SD Card Error code.
  113. *******************************************************************************/
  114. SD_Error SD_Init(void)
  115. {
  116. SD_Error errorstatus = SD_OK;
  117. /* Configure SDIO interface GPIO */
  118. GPIO_Configuration();
  119. /* Enable the SDIO AHB Clock */
  120. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, ENABLE);
  121. /* Enable the DMA2 Clock */
  122. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
  123. SDIO_DeInit();
  124. errorstatus = SD_PowerON();
  125. if (errorstatus != SD_OK)
  126. {
  127. /* CMD Response TimeOut (wait for CMDSENT flag) */
  128. return(errorstatus);
  129. }
  130. errorstatus = SD_InitializeCards();
  131. if (errorstatus != SD_OK)
  132. {
  133. /* CMD Response TimeOut (wait for CMDSENT flag) */
  134. return(errorstatus);
  135. }
  136. /* Configure the SDIO peripheral */
  137. /* HCLK = 72 MHz, SDIOCLK = 72 MHz, SDIO_CK = HCLK/(2 + 1) = 24 MHz */
  138. SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
  139. SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  140. SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  141. SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  142. SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
  143. SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  144. SDIO_Init(&SDIO_InitStructure);
  145. return(errorstatus);
  146. }
  147. /*******************************************************************************
  148. * Function Name : SD_PowerON
  149. * Description : Enquires cards about their operating voltage and configures
  150. * clock controls.
  151. * Input : None
  152. * Output : None
  153. * Return : SD_Error: SD Card Error code.
  154. *******************************************************************************/
  155. SD_Error SD_PowerON(void)
  156. {
  157. SD_Error errorstatus = SD_OK;
  158. u32 response = 0, count = 0;
  159. bool validvoltage = FALSE;
  160. u32 SDType = SD_STD_CAPACITY;
  161. /* Power ON Sequence -------------------------------------------------------*/
  162. /* Configure the SDIO peripheral */
  163. SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; /* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */
  164. SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  165. SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  166. SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  167. SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
  168. SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  169. SDIO_Init(&SDIO_InitStructure);
  170. /* Set Power State to ON */
  171. SDIO_SetPowerState(SDIO_PowerState_ON);
  172. /* Enable SDIO Clock */
  173. SDIO_ClockCmd(ENABLE);
  174. /* CMD0: GO_IDLE_STATE -------------------------------------------------------*/
  175. /* No CMD response required */
  176. SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  177. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_GO_IDLE_STATE;
  178. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;
  179. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  180. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  181. SDIO_SendCommand(&SDIO_CmdInitStructure);
  182. errorstatus = CmdError();
  183. if (errorstatus != SD_OK)
  184. {
  185. /* CMD Response TimeOut (wait for CMDSENT flag) */
  186. return(errorstatus);
  187. }
  188. /* CMD8: SEND_IF_COND --------------------------------------------------------*/
  189. /* Send CMD8 to verify SD card interface operating condition */
  190. /* Argument: - [31:12]: Reserved (shall be set to '0')
  191. - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)
  192. - [7:0]: Check Pattern (recommended 0xAA) */
  193. /* CMD Response: R7 */
  194. SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
  195. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
  196. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  197. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  198. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  199. SDIO_SendCommand(&SDIO_CmdInitStructure);
  200. errorstatus = CmdResp7Error();
  201. if (errorstatus == SD_OK)
  202. {
  203. CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; /* SD Card 2.0 */
  204. SDType = SD_HIGH_CAPACITY;
  205. }
  206. else
  207. {
  208. /* CMD55 */
  209. SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  210. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  211. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  212. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  213. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  214. SDIO_SendCommand(&SDIO_CmdInitStructure);
  215. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  216. }
  217. /* CMD55 */
  218. SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  219. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  220. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  221. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  222. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  223. SDIO_SendCommand(&SDIO_CmdInitStructure);
  224. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  225. /* If errorstatus is Command TimeOut, it is a MMC card */
  226. /* If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
  227. or SD card 1.x */
  228. if (errorstatus == SD_OK)
  229. {
  230. /* SD CARD */
  231. /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
  232. while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
  233. {
  234. /* SEND CMD55 APP_CMD with RCA as 0 */
  235. SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  236. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  237. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  238. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  239. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  240. SDIO_SendCommand(&SDIO_CmdInitStructure);
  241. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  242. if (errorstatus != SD_OK)
  243. {
  244. return(errorstatus);
  245. }
  246. SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
  247. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_OP_COND;
  248. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  249. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  250. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  251. SDIO_SendCommand(&SDIO_CmdInitStructure);
  252. errorstatus = CmdResp3Error();
  253. if (errorstatus != SD_OK)
  254. {
  255. return(errorstatus);
  256. }
  257. response = SDIO_GetResponse(SDIO_RESP1);
  258. validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0);
  259. count++;
  260. }
  261. if (count >= SD_MAX_VOLT_TRIAL)
  262. {
  263. errorstatus = SD_INVALID_VOLTRANGE;
  264. return(errorstatus);
  265. }
  266. if (response &= SD_HIGH_CAPACITY)
  267. {
  268. CardType = SDIO_HIGH_CAPACITY_SD_CARD;
  269. }
  270. }/* else MMC Card */
  271. else
  272. {
  273. CardType = SDIO_MULTIMEDIA_CARD;
  274. /* Send CMD1 SEND_OP_COND with Argument 0x80FF8000 */
  275. while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
  276. {
  277. /* SEND CMD55 APP_CMD with RCA as 0 */
  278. SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_MMC;
  279. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_OP_COND;
  280. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  281. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  282. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  283. SDIO_SendCommand(&SDIO_CmdInitStructure);
  284. errorstatus = CmdResp3Error();
  285. if (errorstatus != SD_OK)
  286. {
  287. return(errorstatus);
  288. }
  289. response = SDIO_GetResponse(SDIO_RESP1);
  290. validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0);
  291. count++;
  292. }
  293. if (count >= SD_MAX_VOLT_TRIAL)
  294. {
  295. errorstatus = SD_INVALID_VOLTRANGE;
  296. return(errorstatus);
  297. }
  298. }
  299. return(SD_OK);
  300. }
  301. /*******************************************************************************
  302. * Function Name : SD_PowerOFF
  303. * Description : Turns the SDIO output signals off.
  304. * Input : None
  305. * Output : None
  306. * Return : SD_Error: SD Card Error code.
  307. *******************************************************************************/
  308. SD_Error SD_PowerOFF(void)
  309. {
  310. SD_Error errorstatus = SD_OK;
  311. /* Set Power State to OFF */
  312. SDIO_SetPowerState(SDIO_PowerState_OFF);
  313. return(errorstatus);
  314. }
  315. /*******************************************************************************
  316. * Function Name : SD_InitializeCards
  317. * Description : Intialises all cards or single card as the case may be.
  318. * Card(s) come into standby state.
  319. * Input : None
  320. * Output : None
  321. * Return : SD_Error: SD Card Error code.
  322. *******************************************************************************/
  323. SD_Error SD_InitializeCards(void)
  324. {
  325. SD_Error errorstatus = SD_OK;
  326. u16 rca = 0x01;
  327. // u32 count = 0;
  328. if (SDIO_GetPowerState() == SDIO_PowerState_OFF)
  329. {
  330. errorstatus = SD_REQUEST_NOT_APPLICABLE;
  331. return(errorstatus);
  332. }
  333. if (SDIO_SECURE_DIGITAL_IO_CARD != CardType)
  334. {
  335. /* Send CMD2 ALL_SEND_CID */
  336. SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  337. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_ALL_SEND_CID;
  338. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
  339. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  340. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  341. SDIO_SendCommand(&SDIO_CmdInitStructure);
  342. errorstatus = CmdResp2Error();
  343. if (SD_OK != errorstatus)
  344. {
  345. return(errorstatus);
  346. }
  347. CID_Tab[0] = SDIO_GetResponse(SDIO_RESP1);
  348. CID_Tab[1] = SDIO_GetResponse(SDIO_RESP2);
  349. CID_Tab[2] = SDIO_GetResponse(SDIO_RESP3);
  350. CID_Tab[3] = SDIO_GetResponse(SDIO_RESP4);
  351. }
  352. if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_SECURE_DIGITAL_IO_COMBO_CARD == CardType)
  353. || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  354. {
  355. /* Send CMD3 SET_REL_ADDR with argument 0 */
  356. /* SD Card publishes its RCA. */
  357. SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  358. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_REL_ADDR;
  359. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  360. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  361. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  362. SDIO_SendCommand(&SDIO_CmdInitStructure);
  363. errorstatus = CmdResp6Error(SDIO_SET_REL_ADDR, &rca);
  364. if (SD_OK != errorstatus)
  365. {
  366. return(errorstatus);
  367. }
  368. }
  369. if (SDIO_MULTIMEDIA_CARD == CardType)
  370. {
  371. /* Send CMD3 SET_REL_ADDR with argument 0 */
  372. /* SD Card publishes its RCA. */
  373. SDIO_CmdInitStructure.SDIO_Argument = (u32)(rca << 16);
  374. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_REL_ADDR;
  375. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  376. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  377. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  378. SDIO_SendCommand(&SDIO_CmdInitStructure);
  379. errorstatus = CmdResp2Error();
  380. if (SD_OK != errorstatus)
  381. {
  382. return(errorstatus);
  383. }
  384. }
  385. if (SDIO_SECURE_DIGITAL_IO_CARD != CardType)
  386. {
  387. RCA = rca;
  388. /* Send CMD9 SEND_CSD with argument as card's RCA */
  389. SDIO_CmdInitStructure.SDIO_Argument = (u32)(rca << 16);
  390. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_CSD;
  391. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
  392. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  393. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  394. SDIO_SendCommand(&SDIO_CmdInitStructure);
  395. errorstatus = CmdResp2Error();
  396. if (SD_OK != errorstatus)
  397. {
  398. return(errorstatus);
  399. }
  400. CSD_Tab[0] = SDIO_GetResponse(SDIO_RESP1);
  401. CSD_Tab[1] = SDIO_GetResponse(SDIO_RESP2);
  402. CSD_Tab[2] = SDIO_GetResponse(SDIO_RESP3);
  403. CSD_Tab[3] = SDIO_GetResponse(SDIO_RESP4);
  404. }
  405. errorstatus = SD_OK; /* All cards get intialized */
  406. return(errorstatus);
  407. }
  408. /*******************************************************************************
  409. * Function Name : SD_GetCardInfo
  410. * Description : Returns information about specific card.
  411. * Input : cardinfo : pointer to a SD_CardInfo structure
  412. * that contains all SD card information.
  413. * Output : None
  414. * Return : SD_Error: SD Card Error code.
  415. *******************************************************************************/
  416. SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo)
  417. {
  418. SD_Error errorstatus = SD_OK;
  419. u8 tmp = 0;
  420. cardinfo->CardType = (u8)CardType;
  421. cardinfo->RCA = (u16)RCA;
  422. /* Byte 0 */
  423. tmp = (u8)((CSD_Tab[0] & 0xFF000000) >> 24);
  424. cardinfo->SD_csd.CSDStruct = (tmp & 0xC0) >> 6;
  425. cardinfo->SD_csd.SysSpecVersion = (tmp & 0x3C) >> 2;
  426. cardinfo->SD_csd.Reserved1 = tmp & 0x03;
  427. /* Byte 1 */
  428. tmp = (u8)((CSD_Tab[0] & 0x00FF0000) >> 16);
  429. cardinfo->SD_csd.TAAC = tmp;
  430. /* Byte 2 */
  431. tmp = (u8)((CSD_Tab[0] & 0x0000FF00) >> 8);
  432. cardinfo->SD_csd.NSAC = tmp;
  433. /* Byte 3 */
  434. tmp = (u8)(CSD_Tab[0] & 0x000000FF);
  435. cardinfo->SD_csd.MaxBusClkFrec = tmp;
  436. /* Byte 4 */
  437. tmp = (u8)((CSD_Tab[1] & 0xFF000000) >> 24);
  438. cardinfo->SD_csd.CardComdClasses = tmp << 4;
  439. /* Byte 5 */
  440. tmp = (u8)((CSD_Tab[1] & 0x00FF0000) >> 16);
  441. cardinfo->SD_csd.CardComdClasses |= (tmp & 0xF0) >> 4;
  442. cardinfo->SD_csd.RdBlockLen = tmp & 0x0F;
  443. /* Byte 6 */
  444. tmp = (u8)((CSD_Tab[1] & 0x0000FF00) >> 8);
  445. cardinfo->SD_csd.PartBlockRead = (tmp & 0x80) >> 7;
  446. cardinfo->SD_csd.WrBlockMisalign = (tmp & 0x40) >> 6;
  447. cardinfo->SD_csd.RdBlockMisalign = (tmp & 0x20) >> 5;
  448. cardinfo->SD_csd.DSRImpl = (tmp & 0x10) >> 4;
  449. cardinfo->SD_csd.Reserved2 = 0; /* Reserved */
  450. if ((CardType == SDIO_STD_CAPACITY_SD_CARD_V1_1) || (CardType == SDIO_STD_CAPACITY_SD_CARD_V2_0))
  451. {
  452. cardinfo->SD_csd.DeviceSize = (tmp & 0x03) << 10;
  453. /* Byte 7 */
  454. tmp = (u8)(CSD_Tab[1] & 0x000000FF);
  455. cardinfo->SD_csd.DeviceSize |= (tmp) << 2;
  456. /* Byte 8 */
  457. tmp = (u8)((CSD_Tab[2] & 0xFF000000) >> 24);
  458. cardinfo->SD_csd.DeviceSize |= (tmp & 0xC0) >> 6;
  459. cardinfo->SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3;
  460. cardinfo->SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07);
  461. /* Byte 9 */
  462. tmp = (u8)((CSD_Tab[2] & 0x00FF0000) >> 16);
  463. cardinfo->SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5;
  464. cardinfo->SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2;
  465. cardinfo->SD_csd.DeviceSizeMul = (tmp & 0x03) << 1;
  466. /* Byte 10 */
  467. tmp = (u8)((CSD_Tab[2] & 0x0000FF00) >> 8);
  468. cardinfo->SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7;
  469. cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) ;
  470. cardinfo->CardCapacity *= (1 << (cardinfo->SD_csd.DeviceSizeMul + 2));
  471. cardinfo->CardBlockSize = 1 << (cardinfo->SD_csd.RdBlockLen);
  472. cardinfo->CardCapacity *= cardinfo->CardBlockSize;
  473. }
  474. else if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  475. {
  476. /* Byte 7 */
  477. tmp = (u8)(CSD_Tab[1] & 0x000000FF);
  478. cardinfo->SD_csd.DeviceSize = (tmp & 0x3F) << 16;
  479. /* Byte 8 */
  480. tmp = (u8)((CSD_Tab[2] & 0xFF000000) >> 24);
  481. cardinfo->SD_csd.DeviceSize |= (tmp << 8);
  482. /* Byte 9 */
  483. tmp = (u8)((CSD_Tab[2] & 0x00FF0000) >> 16);
  484. cardinfo->SD_csd.DeviceSize |= (tmp);
  485. /* Byte 10 */
  486. tmp = (u8)((CSD_Tab[2] & 0x0000FF00) >> 8);
  487. cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
  488. cardinfo->CardBlockSize = 512;
  489. }
  490. cardinfo->SD_csd.EraseGrSize = (tmp & 0x40) >> 6;
  491. cardinfo->SD_csd.EraseGrMul = (tmp & 0x3F) << 1;
  492. /* Byte 11 */
  493. tmp = (u8)(CSD_Tab[2] & 0x000000FF);
  494. cardinfo->SD_csd.EraseGrMul |= (tmp & 0x80) >> 7;
  495. cardinfo->SD_csd.WrProtectGrSize = (tmp & 0x7F);
  496. /* Byte 12 */
  497. tmp = (u8)((CSD_Tab[3] & 0xFF000000) >> 24);
  498. cardinfo->SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7;
  499. cardinfo->SD_csd.ManDeflECC = (tmp & 0x60) >> 5;
  500. cardinfo->SD_csd.WrSpeedFact = (tmp & 0x1C) >> 2;
  501. cardinfo->SD_csd.MaxWrBlockLen = (tmp & 0x03) << 2;
  502. /* Byte 13 */
  503. tmp = (u8)((CSD_Tab[3] & 0x00FF0000) >> 16);
  504. cardinfo->SD_csd.MaxWrBlockLen |= (tmp & 0xC0) >> 6;
  505. cardinfo->SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5;
  506. cardinfo->SD_csd.Reserved3 = 0;
  507. cardinfo->SD_csd.ContentProtectAppli = (tmp & 0x01);
  508. /* Byte 14 */
  509. tmp = (u8)((CSD_Tab[3] & 0x0000FF00) >> 8);
  510. cardinfo->SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7;
  511. cardinfo->SD_csd.CopyFlag = (tmp & 0x40) >> 6;
  512. cardinfo->SD_csd.PermWrProtect = (tmp & 0x20) >> 5;
  513. cardinfo->SD_csd.TempWrProtect = (tmp & 0x10) >> 4;
  514. cardinfo->SD_csd.FileFormat = (tmp & 0x0C) >> 2;
  515. cardinfo->SD_csd.ECC = (tmp & 0x03);
  516. /* Byte 15 */
  517. tmp = (u8)(CSD_Tab[3] & 0x000000FF);
  518. cardinfo->SD_csd.CSD_CRC = (tmp & 0xFE) >> 1;
  519. cardinfo->SD_csd.Reserved4 = 1;
  520. /* Byte 0 */
  521. tmp = (u8)((CID_Tab[0] & 0xFF000000) >> 24);
  522. cardinfo->SD_cid.ManufacturerID = tmp;
  523. /* Byte 1 */
  524. tmp = (u8)((CID_Tab[0] & 0x00FF0000) >> 16);
  525. cardinfo->SD_cid.OEM_AppliID = tmp << 8;
  526. /* Byte 2 */
  527. tmp = (u8)((CID_Tab[0] & 0x000000FF00) >> 8);
  528. cardinfo->SD_cid.OEM_AppliID |= tmp;
  529. /* Byte 3 */
  530. tmp = (u8)(CID_Tab[0] & 0x000000FF);
  531. cardinfo->SD_cid.ProdName1 = tmp << 24;
  532. /* Byte 4 */
  533. tmp = (u8)((CID_Tab[1] & 0xFF000000) >> 24);
  534. cardinfo->SD_cid.ProdName1 |= tmp << 16;
  535. /* Byte 5 */
  536. tmp = (u8)((CID_Tab[1] & 0x00FF0000) >> 16);
  537. cardinfo->SD_cid.ProdName1 |= tmp << 8;
  538. /* Byte 6 */
  539. tmp = (u8)((CID_Tab[1] & 0x0000FF00) >> 8);
  540. cardinfo->SD_cid.ProdName1 |= tmp;
  541. /* Byte 7 */
  542. tmp = (u8)(CID_Tab[1] & 0x000000FF);
  543. cardinfo->SD_cid.ProdName2 = tmp;
  544. /* Byte 8 */
  545. tmp = (u8)((CID_Tab[2] & 0xFF000000) >> 24);
  546. cardinfo->SD_cid.ProdRev = tmp;
  547. /* Byte 9 */
  548. tmp = (u8)((CID_Tab[2] & 0x00FF0000) >> 16);
  549. cardinfo->SD_cid.ProdSN = tmp << 24;
  550. /* Byte 10 */
  551. tmp = (u8)((CID_Tab[2] & 0x0000FF00) >> 8);
  552. cardinfo->SD_cid.ProdSN |= tmp << 16;
  553. /* Byte 11 */
  554. tmp = (u8)(CID_Tab[2] & 0x000000FF);
  555. cardinfo->SD_cid.ProdSN |= tmp << 8;
  556. /* Byte 12 */
  557. tmp = (u8)((CID_Tab[3] & 0xFF000000) >> 24);
  558. cardinfo->SD_cid.ProdSN |= tmp;
  559. /* Byte 13 */
  560. tmp = (u8)((CID_Tab[3] & 0x00FF0000) >> 16);
  561. cardinfo->SD_cid.Reserved1 |= (tmp & 0xF0) >> 4;
  562. cardinfo->SD_cid.ManufactDate = (tmp & 0x0F) << 8;
  563. /* Byte 14 */
  564. tmp = (u8)((CID_Tab[3] & 0x0000FF00) >> 8);
  565. cardinfo->SD_cid.ManufactDate |= tmp;
  566. /* Byte 15 */
  567. tmp = (u8)(CID_Tab[3] & 0x000000FF);
  568. cardinfo->SD_cid.CID_CRC = (tmp & 0xFE) >> 1;
  569. cardinfo->SD_cid.Reserved2 = 1;
  570. return(errorstatus);
  571. }
  572. /*******************************************************************************
  573. * Function Name : SD_EnableWideBusOperation
  574. * Description : Enables wide bus opeartion for the requeseted card if
  575. * supported by card.
  576. * Input : WideMode: Specifies the SD card wide bus mode.
  577. * This parameter can be one of the following values:
  578. * - SDIO_BusWide_8b: 8-bit data transfer (Only for MMC)
  579. * - SDIO_BusWide_4b: 4-bit data transfer
  580. * - SDIO_BusWide_1b: 1-bit data transfer
  581. * Output : None
  582. * Return : SD_Error: SD Card Error code.
  583. *******************************************************************************/
  584. SD_Error SD_EnableWideBusOperation(u32 WideMode)
  585. {
  586. SD_Error errorstatus = SD_OK;
  587. /* MMC Card doesn't support this feature */
  588. if (SDIO_MULTIMEDIA_CARD == CardType)
  589. {
  590. errorstatus = SD_UNSUPPORTED_FEATURE;
  591. return(errorstatus);
  592. }
  593. else if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  594. {
  595. if (SDIO_BusWide_8b == WideMode)
  596. {
  597. errorstatus = SD_UNSUPPORTED_FEATURE;
  598. return(errorstatus);
  599. }
  600. else if (SDIO_BusWide_4b == WideMode)
  601. {
  602. errorstatus = SDEnWideBus(ENABLE);
  603. if (SD_OK == errorstatus)
  604. {
  605. /* Configure the SDIO peripheral */
  606. SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
  607. SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  608. SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  609. SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  610. SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_4b;
  611. SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  612. SDIO_Init(&SDIO_InitStructure);
  613. }
  614. }
  615. else
  616. {
  617. errorstatus = SDEnWideBus(DISABLE);
  618. if (SD_OK == errorstatus)
  619. {
  620. /* Configure the SDIO peripheral */
  621. SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
  622. SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  623. SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  624. SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  625. SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
  626. SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  627. SDIO_Init(&SDIO_InitStructure);
  628. }
  629. }
  630. }
  631. return(errorstatus);
  632. }
  633. /*******************************************************************************
  634. * Function Name : SD_SetDeviceMode
  635. * Description : Sets device mode whether to operate in Polling, Interrupt or
  636. * DMA mode.
  637. * Input : Mode: Specifies the Data Transfer mode.
  638. * This parameter can be one of the following values:
  639. * - SD_DMA_MODE: Data transfer using DMA.
  640. * - SD_INTERRUPT_MODE: Data transfer using interrupts.
  641. * - SD_POLLING_MODE: Data transfer using flags.
  642. * Output : None
  643. * Return : SD_Error: SD Card Error code.
  644. *******************************************************************************/
  645. SD_Error SD_SetDeviceMode(u32 Mode)
  646. {
  647. SD_Error errorstatus = SD_OK;
  648. if ((Mode == SD_DMA_MODE) || (Mode == SD_INTERRUPT_MODE) || (Mode == SD_POLLING_MODE))
  649. {
  650. DeviceMode = Mode;
  651. }
  652. else
  653. {
  654. errorstatus = SD_INVALID_PARAMETER;
  655. }
  656. return(errorstatus);
  657. }
  658. /*******************************************************************************
  659. * Function Name : SD_SelectDeselect
  660. * Description : Selects od Deselects the corresponding card.
  661. * Input : addr: Address of the Card to be selected.
  662. * Output : None
  663. * Return : SD_Error: SD Card Error code.
  664. *******************************************************************************/
  665. SD_Error SD_SelectDeselect(u32 addr)
  666. {
  667. SD_Error errorstatus = SD_OK;
  668. /* Send CMD7 SDIO_SEL_DESEL_CARD */
  669. SDIO_CmdInitStructure.SDIO_Argument = addr;
  670. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEL_DESEL_CARD;
  671. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  672. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  673. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  674. SDIO_SendCommand(&SDIO_CmdInitStructure);
  675. errorstatus = CmdResp1Error(SDIO_SEL_DESEL_CARD);
  676. return(errorstatus);
  677. }
  678. /*******************************************************************************
  679. * Function Name : SD_ReadBlock
  680. * Description : Allows to read one block from a specified address in a card.
  681. * Input : - addr: Address from where data are to be read.
  682. * - readbuff: pointer to the buffer that will contain the
  683. * received data
  684. * - blocksize: the SD card Data block size.
  685. * Output : None
  686. * Return : SD_Error: SD Card Error code.
  687. *******************************************************************************/
  688. SD_Error SD_ReadBlock(u32 addr, u32 *readbuff, u16 BlockSize)
  689. {
  690. SD_Error errorstatus = SD_OK;
  691. u32 count = 0, *tempbuff = readbuff;
  692. u8 power = 0;
  693. if (NULL == readbuff)
  694. {
  695. errorstatus = SD_INVALID_PARAMETER;
  696. return(errorstatus);
  697. }
  698. TransferError = SD_OK;
  699. TransferEnd = 0;
  700. TotalNumberOfBytes = 0;
  701. /* Clear all DPSM configuration */
  702. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  703. SDIO_DataInitStructure.SDIO_DataLength = 0;
  704. SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
  705. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  706. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  707. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable;
  708. SDIO_DataConfig(&SDIO_DataInitStructure);
  709. SDIO_DMACmd(DISABLE);
  710. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  711. {
  712. errorstatus = SD_LOCK_UNLOCK_FAILED;
  713. return(errorstatus);
  714. }
  715. if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  716. {
  717. BlockSize = 512;
  718. addr /= 512;
  719. }
  720. if ((BlockSize > 0) && (BlockSize <= 2048) && ((BlockSize & (BlockSize - 1)) == 0))
  721. {
  722. power = convert_from_bytes_to_power_of_two(BlockSize);
  723. /* Set Block Size for Card */
  724. SDIO_CmdInitStructure.SDIO_Argument = (u32) BlockSize;
  725. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  726. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  727. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  728. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  729. SDIO_SendCommand(&SDIO_CmdInitStructure);
  730. errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);
  731. if (SD_OK != errorstatus)
  732. {
  733. return(errorstatus);
  734. }
  735. }
  736. else
  737. {
  738. errorstatus = SD_INVALID_PARAMETER;
  739. return(errorstatus);
  740. }
  741. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  742. SDIO_DataInitStructure.SDIO_DataLength = BlockSize;
  743. SDIO_DataInitStructure.SDIO_DataBlockSize = (u32) power << 4;
  744. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
  745. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  746. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  747. SDIO_DataConfig(&SDIO_DataInitStructure);
  748. TotalNumberOfBytes = BlockSize;
  749. StopCondition = 0;
  750. DestBuffer = readbuff;
  751. /* Send CMD17 READ_SINGLE_BLOCK */
  752. SDIO_CmdInitStructure.SDIO_Argument = (u32)addr;
  753. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_SINGLE_BLOCK;
  754. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  755. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  756. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  757. SDIO_SendCommand(&SDIO_CmdInitStructure);
  758. errorstatus = CmdResp1Error(SDIO_READ_SINGLE_BLOCK);
  759. if (errorstatus != SD_OK)
  760. {
  761. return(errorstatus);
  762. }
  763. /* In case of single block transfer, no need of stop transfer at all.*/
  764. if (DeviceMode == SD_POLLING_MODE)
  765. {
  766. /* Polling mode */
  767. while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
  768. {
  769. if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
  770. {
  771. for (count = 0; count < 8; count++)
  772. {
  773. *(tempbuff + count) = SDIO_ReadData();
  774. }
  775. tempbuff += 8;
  776. }
  777. }
  778. if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  779. {
  780. SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  781. errorstatus = SD_DATA_TIMEOUT;
  782. return(errorstatus);
  783. }
  784. else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  785. {
  786. SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  787. errorstatus = SD_DATA_CRC_FAIL;
  788. return(errorstatus);
  789. }
  790. else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
  791. {
  792. SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
  793. errorstatus = SD_RX_OVERRUN;
  794. return(errorstatus);
  795. }
  796. else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  797. {
  798. SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  799. errorstatus = SD_START_BIT_ERR;
  800. return(errorstatus);
  801. }
  802. while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
  803. {
  804. *tempbuff = SDIO_ReadData();
  805. tempbuff++;
  806. }
  807. /* Clear all the static flags */
  808. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  809. }
  810. else if (DeviceMode == SD_INTERRUPT_MODE)
  811. {
  812. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE);
  813. while ((TransferEnd == 0) && (TransferError == SD_OK))
  814. {}
  815. if (TransferError != SD_OK)
  816. {
  817. return(TransferError);
  818. }
  819. }
  820. else if (DeviceMode == SD_DMA_MODE)
  821. {
  822. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
  823. SDIO_DMACmd(ENABLE);
  824. DMA_RxConfiguration(readbuff, BlockSize);
  825. while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
  826. {}
  827. }
  828. return(errorstatus);
  829. }
  830. /*******************************************************************************
  831. * Function Name : SD_ReadMultiBlocks
  832. * Description : Allows to read blocks from a specified address in a card.
  833. * Input : - addr: Address from where data are to be read.
  834. * - readbuff: pointer to the buffer that will contain the
  835. * received data.
  836. * - BlockSize: the SD card Data block size.
  837. * - NumberOfBlocks: number of blocks to be read.
  838. * Output : None
  839. * Return : SD_Error: SD Card Error code.
  840. *******************************************************************************/
  841. SD_Error SD_ReadMultiBlocks(u32 addr, u32 *readbuff, u16 BlockSize, u32 NumberOfBlocks)
  842. {
  843. SD_Error errorstatus = SD_OK;
  844. u32 count = 0, *tempbuff = readbuff;
  845. u8 power = 0;
  846. if (NULL == readbuff)
  847. {
  848. errorstatus = SD_INVALID_PARAMETER;
  849. return(errorstatus);
  850. }
  851. TransferError = SD_OK;
  852. TransferEnd = 0;
  853. TotalNumberOfBytes = 0;
  854. /* Clear all DPSM configuration */
  855. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  856. SDIO_DataInitStructure.SDIO_DataLength = 0;
  857. SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
  858. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  859. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  860. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable;
  861. SDIO_DataConfig(&SDIO_DataInitStructure);
  862. SDIO_DMACmd(DISABLE);
  863. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  864. {
  865. errorstatus = SD_LOCK_UNLOCK_FAILED;
  866. return(errorstatus);
  867. }
  868. if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  869. {
  870. BlockSize = 512;
  871. addr /= 512;
  872. }
  873. if ((BlockSize > 0) && (BlockSize <= 2048) && (0 == (BlockSize & (BlockSize - 1))))
  874. {
  875. power = convert_from_bytes_to_power_of_two(BlockSize);
  876. /* Set Block Size for Card */
  877. SDIO_CmdInitStructure.SDIO_Argument = (u32) BlockSize;
  878. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  879. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  880. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  881. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  882. SDIO_SendCommand(&SDIO_CmdInitStructure);
  883. errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);
  884. if (SD_OK != errorstatus)
  885. {
  886. return(errorstatus);
  887. }
  888. }
  889. else
  890. {
  891. errorstatus = SD_INVALID_PARAMETER;
  892. return(errorstatus);
  893. }
  894. if (NumberOfBlocks > 1)
  895. {
  896. /* Common to all modes */
  897. if (NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH)
  898. {
  899. errorstatus = SD_INVALID_PARAMETER;
  900. return(errorstatus);
  901. }
  902. TotalNumberOfBytes = NumberOfBlocks * BlockSize;
  903. StopCondition = 1;
  904. DestBuffer = readbuff;
  905. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  906. SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize;
  907. SDIO_DataInitStructure.SDIO_DataBlockSize = (u32) power << 4;
  908. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
  909. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  910. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  911. SDIO_DataConfig(&SDIO_DataInitStructure);
  912. /* Send CMD18 READ_MULT_BLOCK with argument data address */
  913. SDIO_CmdInitStructure.SDIO_Argument = (u32)addr;
  914. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_READ_MULT_BLOCK;
  915. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  916. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  917. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  918. SDIO_SendCommand(&SDIO_CmdInitStructure);
  919. errorstatus = CmdResp1Error(SDIO_READ_MULT_BLOCK);
  920. if (errorstatus != SD_OK)
  921. {
  922. return(errorstatus);
  923. }
  924. if (DeviceMode == SD_POLLING_MODE)
  925. {
  926. /* Polling mode */
  927. while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))
  928. {
  929. if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
  930. {
  931. for (count = 0; count < SD_HALFFIFO; count++)
  932. {
  933. *(tempbuff + count) = SDIO_ReadData();
  934. }
  935. tempbuff += SD_HALFFIFO;
  936. }
  937. }
  938. if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  939. {
  940. SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  941. errorstatus = SD_DATA_TIMEOUT;
  942. return(errorstatus);
  943. }
  944. else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  945. {
  946. SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  947. errorstatus = SD_DATA_CRC_FAIL;
  948. return(errorstatus);
  949. }
  950. else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
  951. {
  952. SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
  953. errorstatus = SD_RX_OVERRUN;
  954. return(errorstatus);
  955. }
  956. else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  957. {
  958. SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  959. errorstatus = SD_START_BIT_ERR;
  960. return(errorstatus);
  961. }
  962. while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
  963. {
  964. *tempbuff = SDIO_ReadData();
  965. tempbuff++;
  966. }
  967. if (SDIO_GetFlagStatus(SDIO_FLAG_DATAEND) != RESET)
  968. {
  969. /* In Case Of SD-CARD Send Command STOP_TRANSMISSION */
  970. if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType))
  971. {
  972. /* Send CMD12 STOP_TRANSMISSION */
  973. SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  974. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION;
  975. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  976. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  977. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  978. SDIO_SendCommand(&SDIO_CmdInitStructure);
  979. errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION);
  980. if (errorstatus != SD_OK)
  981. {
  982. return(errorstatus);
  983. }
  984. }
  985. }
  986. /* Clear all the static flags */
  987. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  988. }
  989. else if (DeviceMode == SD_INTERRUPT_MODE)
  990. {
  991. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_RXFIFOHF | SDIO_IT_STBITERR, ENABLE);
  992. while ((TransferEnd == 0) && (TransferError == SD_OK))
  993. {}
  994. if (TransferError != SD_OK)
  995. {
  996. return(TransferError);
  997. }
  998. }
  999. else if (DeviceMode == SD_DMA_MODE)
  1000. {
  1001. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
  1002. SDIO_DMACmd(ENABLE);
  1003. DMA_RxConfiguration(readbuff, (NumberOfBlocks * BlockSize));
  1004. while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
  1005. {}
  1006. while ((TransferEnd == 0) && (TransferError == SD_OK))
  1007. {}
  1008. if (TransferError != SD_OK)
  1009. {
  1010. return(TransferError);
  1011. }
  1012. }
  1013. }
  1014. return(errorstatus);
  1015. }
  1016. /*******************************************************************************
  1017. * Function Name : SD_WriteBlock
  1018. * Description : Allows to write one block starting from a specified address
  1019. * in a card.
  1020. * Input : - addr: Address from where data are to be read.
  1021. * - writebuff: pointer to the buffer that contain the data to be
  1022. * transferred.
  1023. * - BlockSize: the SD card Data block size.
  1024. * Output : None
  1025. * Return : SD_Error: SD Card Error code.
  1026. *******************************************************************************/
  1027. SD_Error SD_WriteBlock(u32 addr, u32 *writebuff, u16 BlockSize)
  1028. {
  1029. SD_Error errorstatus = SD_OK;
  1030. u8 power = 0, cardstate = 0;
  1031. u32 timeout = 0, bytestransferred = 0;
  1032. u32 cardstatus = 0, count = 0, restwords = 0;
  1033. u32 *tempbuff = writebuff;
  1034. if (writebuff == NULL)
  1035. {
  1036. errorstatus = SD_INVALID_PARAMETER;
  1037. return(errorstatus);
  1038. }
  1039. TransferError = SD_OK;
  1040. TransferEnd = 0;
  1041. TotalNumberOfBytes = 0;
  1042. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  1043. SDIO_DataInitStructure.SDIO_DataLength = 0;
  1044. SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
  1045. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  1046. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  1047. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable;
  1048. SDIO_DataConfig(&SDIO_DataInitStructure);
  1049. SDIO_DMACmd(DISABLE);
  1050. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  1051. {
  1052. errorstatus = SD_LOCK_UNLOCK_FAILED;
  1053. return(errorstatus);
  1054. }
  1055. if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  1056. {
  1057. BlockSize = 512;
  1058. addr /= 512;
  1059. }
  1060. /* Set the block size, both on controller and card */
  1061. if ((BlockSize > 0) && (BlockSize <= 2048) && ((BlockSize & (BlockSize - 1)) == 0))
  1062. {
  1063. power = convert_from_bytes_to_power_of_two(BlockSize);
  1064. SDIO_CmdInitStructure.SDIO_Argument = (u32) BlockSize;
  1065. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  1066. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1067. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1068. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1069. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1070. errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);
  1071. if (errorstatus != SD_OK)
  1072. {
  1073. return(errorstatus);
  1074. }
  1075. }
  1076. else
  1077. {
  1078. errorstatus = SD_INVALID_PARAMETER;
  1079. return(errorstatus);
  1080. }
  1081. /* Wait till card is ready for data Added */
  1082. SDIO_CmdInitStructure.SDIO_Argument = (u32) (RCA << 16);
  1083. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS;
  1084. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1085. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1086. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1087. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1088. errorstatus = CmdResp1Error(SDIO_SEND_STATUS);
  1089. if (errorstatus != SD_OK)
  1090. {
  1091. return(errorstatus);
  1092. }
  1093. cardstatus = SDIO_GetResponse(SDIO_RESP1);
  1094. timeout = SD_DATATIMEOUT;
  1095. while (((cardstatus & 0x00000100) == 0) && (timeout > 0))
  1096. {
  1097. timeout--;
  1098. SDIO_CmdInitStructure.SDIO_Argument = (u32) (RCA << 16);
  1099. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS;
  1100. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1101. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1102. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1103. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1104. errorstatus = CmdResp1Error(SDIO_SEND_STATUS);
  1105. if (errorstatus != SD_OK)
  1106. {
  1107. return(errorstatus);
  1108. }
  1109. cardstatus = SDIO_GetResponse(SDIO_RESP1);
  1110. }
  1111. if (timeout == 0)
  1112. {
  1113. return(SD_ERROR);
  1114. }
  1115. /* Send CMD24 WRITE_SINGLE_BLOCK */
  1116. SDIO_CmdInitStructure.SDIO_Argument = addr;
  1117. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_WRITE_SINGLE_BLOCK;
  1118. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1119. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1120. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1121. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1122. errorstatus = CmdResp1Error(SDIO_WRITE_SINGLE_BLOCK);
  1123. if (errorstatus != SD_OK)
  1124. {
  1125. return(errorstatus);
  1126. }
  1127. TotalNumberOfBytes = BlockSize;
  1128. StopCondition = 0;
  1129. SrcBuffer = writebuff;
  1130. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  1131. SDIO_DataInitStructure.SDIO_DataLength = BlockSize;
  1132. SDIO_DataInitStructure.SDIO_DataBlockSize = (u32) power << 4;
  1133. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  1134. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  1135. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  1136. SDIO_DataConfig(&SDIO_DataInitStructure);
  1137. /* In case of single data block transfer no need of stop command at all */
  1138. if (DeviceMode == SD_POLLING_MODE)
  1139. {
  1140. while (!(SDIO->STA & (SDIO_FLAG_DBCKEND | SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))
  1141. {
  1142. if (SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE) != RESET)
  1143. {
  1144. if ((TotalNumberOfBytes - bytestransferred) < 32)
  1145. {
  1146. restwords = ((TotalNumberOfBytes - bytestransferred) % 4 == 0) ? ((TotalNumberOfBytes - bytestransferred) / 4) : (( TotalNumberOfBytes - bytestransferred) / 4 + 1);
  1147. for (count = 0; count < restwords; count++, tempbuff++, bytestransferred += 4)
  1148. {
  1149. SDIO_WriteData(*tempbuff);
  1150. }
  1151. }
  1152. else
  1153. {
  1154. for (count = 0; count < 8; count++)
  1155. {
  1156. SDIO_WriteData(*(tempbuff + count));
  1157. }
  1158. tempbuff += 8;
  1159. bytestransferred += 32;
  1160. }
  1161. }
  1162. }
  1163. if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  1164. {
  1165. SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  1166. errorstatus = SD_DATA_TIMEOUT;
  1167. return(errorstatus);
  1168. }
  1169. else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  1170. {
  1171. SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  1172. errorstatus = SD_DATA_CRC_FAIL;
  1173. return(errorstatus);
  1174. }
  1175. else if (SDIO_GetFlagStatus(SDIO_FLAG_TXUNDERR) != RESET)
  1176. {
  1177. SDIO_ClearFlag(SDIO_FLAG_TXUNDERR);
  1178. errorstatus = SD_TX_UNDERRUN;
  1179. return(errorstatus);
  1180. }
  1181. else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  1182. {
  1183. SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  1184. errorstatus = SD_START_BIT_ERR;
  1185. return(errorstatus);
  1186. }
  1187. }
  1188. else if (DeviceMode == SD_INTERRUPT_MODE)
  1189. {
  1190. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_FLAG_TXFIFOHE | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE);
  1191. while ((TransferEnd == 0) && (TransferError == SD_OK))
  1192. {}
  1193. if (TransferError != SD_OK)
  1194. {
  1195. return(TransferError);
  1196. }
  1197. }
  1198. else if (DeviceMode == SD_DMA_MODE)
  1199. {
  1200. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE);
  1201. DMA_TxConfiguration(writebuff, BlockSize);
  1202. SDIO_DMACmd(ENABLE);
  1203. while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
  1204. {}
  1205. while ((TransferEnd == 0) && (TransferError == SD_OK))
  1206. {}
  1207. if (TransferError != SD_OK)
  1208. {
  1209. return(TransferError);
  1210. }
  1211. }
  1212. /* Clear all the static flags */
  1213. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  1214. /* Wait till the card is in programming state */
  1215. errorstatus = IsCardProgramming(&cardstate);
  1216. while ((errorstatus == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
  1217. {
  1218. errorstatus = IsCardProgramming(&cardstate);
  1219. }
  1220. return(errorstatus);
  1221. }
  1222. /*******************************************************************************
  1223. * Function Name : SD_WriteMultiBlocks
  1224. * Description : Allows to write blocks starting from a specified address in
  1225. * a card.
  1226. * Input : - addr: Address from where data are to be read.
  1227. * - writebuff: pointer to the buffer that contain the data to be
  1228. * transferred.
  1229. * - BlockSize: the SD card Data block size.
  1230. * - NumberOfBlocks: number of blocks to be written.
  1231. * Output : None
  1232. * Return : SD_Error: SD Card Error code.
  1233. *******************************************************************************/
  1234. SD_Error SD_WriteMultiBlocks(u32 addr, u32 *writebuff, u16 BlockSize, u32 NumberOfBlocks)
  1235. {
  1236. SD_Error errorstatus = SD_OK;
  1237. u8 power = 0, cardstate = 0;
  1238. u32 bytestransferred = 0;
  1239. u32 count = 0, restwords = 0;
  1240. u32 *tempbuff = writebuff;
  1241. if (writebuff == NULL)
  1242. {
  1243. errorstatus = SD_INVALID_PARAMETER;
  1244. return(errorstatus);
  1245. }
  1246. TransferError = SD_OK;
  1247. TransferEnd = 0;
  1248. TotalNumberOfBytes = 0;
  1249. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  1250. SDIO_DataInitStructure.SDIO_DataLength = 0;
  1251. SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
  1252. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  1253. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  1254. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Disable;
  1255. SDIO_DataConfig(&SDIO_DataInitStructure);
  1256. SDIO_DMACmd(DISABLE);
  1257. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  1258. {
  1259. errorstatus = SD_LOCK_UNLOCK_FAILED;
  1260. return(errorstatus);
  1261. }
  1262. if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  1263. {
  1264. BlockSize = 512;
  1265. addr /= 512;
  1266. }
  1267. /* Set the block size, both on controller and card */
  1268. if ((BlockSize > 0) && (BlockSize <= 2048) && ((BlockSize & (BlockSize - 1)) == 0))
  1269. {
  1270. power = convert_from_bytes_to_power_of_two(BlockSize);
  1271. SDIO_CmdInitStructure.SDIO_Argument = (u32) BlockSize;
  1272. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  1273. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1274. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1275. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1276. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1277. errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);
  1278. if (errorstatus != SD_OK)
  1279. {
  1280. return(errorstatus);
  1281. }
  1282. }
  1283. else
  1284. {
  1285. errorstatus = SD_INVALID_PARAMETER;
  1286. return(errorstatus);
  1287. }
  1288. /* Wait till card is ready for data Added */
  1289. SDIO_CmdInitStructure.SDIO_Argument = (u32) (RCA << 16);
  1290. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS;
  1291. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1292. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1293. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1294. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1295. errorstatus = CmdResp1Error(SDIO_SEND_STATUS);
  1296. if (errorstatus != SD_OK)
  1297. {
  1298. return(errorstatus);
  1299. }
  1300. if (NumberOfBlocks > 1)
  1301. {
  1302. /* Common to all modes */
  1303. if (NumberOfBlocks * BlockSize > SD_MAX_DATA_LENGTH)
  1304. {
  1305. errorstatus = SD_INVALID_PARAMETER;
  1306. return(errorstatus);
  1307. }
  1308. if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  1309. {
  1310. /* To improve performance */
  1311. SDIO_CmdInitStructure.SDIO_Argument = (u32) (RCA << 16);
  1312. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  1313. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1314. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1315. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1316. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1317. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  1318. if (errorstatus != SD_OK)
  1319. {
  1320. return(errorstatus);
  1321. }
  1322. /* To improve performance */
  1323. SDIO_CmdInitStructure.SDIO_Argument = (u32)NumberOfBlocks;
  1324. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCK_COUNT;
  1325. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1326. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1327. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1328. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1329. errorstatus = CmdResp1Error(SDIO_SET_BLOCK_COUNT);
  1330. if (errorstatus != SD_OK)
  1331. {
  1332. return(errorstatus);
  1333. }
  1334. }
  1335. /* Send CMD25 WRITE_MULT_BLOCK with argument data address */
  1336. SDIO_CmdInitStructure.SDIO_Argument = (u32)addr;
  1337. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_WRITE_MULT_BLOCK;
  1338. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1339. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1340. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1341. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1342. errorstatus = CmdResp1Error(SDIO_WRITE_MULT_BLOCK);
  1343. if (SD_OK != errorstatus)
  1344. {
  1345. return(errorstatus);
  1346. }
  1347. TotalNumberOfBytes = NumberOfBlocks * BlockSize;
  1348. StopCondition = 1;
  1349. SrcBuffer = writebuff;
  1350. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  1351. SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize;
  1352. SDIO_DataInitStructure.SDIO_DataBlockSize = (u32) power << 4;
  1353. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;
  1354. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  1355. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  1356. SDIO_DataConfig(&SDIO_DataInitStructure);
  1357. if (DeviceMode == SD_POLLING_MODE)
  1358. {
  1359. while (!(SDIO->STA & (SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DATAEND | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR)))
  1360. {
  1361. if (SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE) != RESET)
  1362. {
  1363. if (!((TotalNumberOfBytes - bytestransferred) < SD_HALFFIFOBYTES))
  1364. {
  1365. for (count = 0; count < SD_HALFFIFO; count++)
  1366. {
  1367. SDIO_WriteData(*(tempbuff + count));
  1368. }
  1369. tempbuff += SD_HALFFIFO;
  1370. bytestransferred += SD_HALFFIFOBYTES;
  1371. }
  1372. else
  1373. {
  1374. restwords = ((TotalNumberOfBytes - bytestransferred) % 4 == 0) ? ((TotalNumberOfBytes - bytestransferred) / 4) :
  1375. ((TotalNumberOfBytes - bytestransferred) / 4 + 1);
  1376. for (count = 0; count < restwords; count++, tempbuff++, bytestransferred += 4)
  1377. {
  1378. SDIO_WriteData(*tempbuff);
  1379. }
  1380. }
  1381. }
  1382. }
  1383. if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  1384. {
  1385. SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  1386. errorstatus = SD_DATA_TIMEOUT;
  1387. return(errorstatus);
  1388. }
  1389. else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  1390. {
  1391. SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  1392. errorstatus = SD_DATA_CRC_FAIL;
  1393. return(errorstatus);
  1394. }
  1395. else if (SDIO_GetFlagStatus(SDIO_FLAG_TXUNDERR) != RESET)
  1396. {
  1397. SDIO_ClearFlag(SDIO_FLAG_TXUNDERR);
  1398. errorstatus = SD_TX_UNDERRUN;
  1399. return(errorstatus);
  1400. }
  1401. else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  1402. {
  1403. SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  1404. errorstatus = SD_START_BIT_ERR;
  1405. return(errorstatus);
  1406. }
  1407. if (SDIO_GetFlagStatus(SDIO_FLAG_DATAEND) != RESET)
  1408. {
  1409. if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  1410. {
  1411. /* Send CMD12 STOP_TRANSMISSION */
  1412. SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  1413. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION;
  1414. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1415. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1416. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1417. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1418. errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION);
  1419. if (errorstatus != SD_OK)
  1420. {
  1421. return(errorstatus);
  1422. }
  1423. }
  1424. }
  1425. }
  1426. else if (DeviceMode == SD_INTERRUPT_MODE)
  1427. {
  1428. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_TXFIFOHE | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE);
  1429. while ((TransferEnd == 0) && (TransferError == SD_OK))
  1430. {}
  1431. if (TransferError != SD_OK)
  1432. {
  1433. return(TransferError);
  1434. }
  1435. }
  1436. else if (DeviceMode == SD_DMA_MODE)
  1437. {
  1438. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_TXUNDERR | SDIO_IT_STBITERR, ENABLE);
  1439. SDIO_DMACmd(ENABLE);
  1440. DMA_TxConfiguration(writebuff, (NumberOfBlocks * BlockSize));
  1441. while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET)
  1442. {}
  1443. while ((TransferEnd == 0) && (TransferError == SD_OK))
  1444. {}
  1445. if (TransferError != SD_OK)
  1446. {
  1447. return(TransferError);
  1448. }
  1449. }
  1450. }
  1451. /* Clear all the static flags */
  1452. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  1453. /* Wait till the card is in programming state */
  1454. errorstatus = IsCardProgramming(&cardstate);
  1455. while ((errorstatus == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING)))
  1456. {
  1457. errorstatus = IsCardProgramming(&cardstate);
  1458. }
  1459. return(errorstatus);
  1460. }
  1461. /*******************************************************************************
  1462. * Function Name : SD_GetTransferState
  1463. * Description : Gets the cuurent data transfer state.
  1464. * Input : None
  1465. * Output : None
  1466. * Return : SDTransferState: Data Transfer state.
  1467. * This value can be:
  1468. * - SD_NO_TRANSFER: No data transfer is acting
  1469. * - SD_TRANSFER_IN_PROGRESS: Data transfer is acting
  1470. *******************************************************************************/
  1471. SDTransferState SD_GetTransferState(void)
  1472. {
  1473. if (SDIO->STA & (SDIO_FLAG_TXACT | SDIO_FLAG_RXACT))
  1474. {
  1475. return(SD_TRANSFER_IN_PROGRESS);
  1476. }
  1477. else
  1478. {
  1479. return(SD_NO_TRANSFER);
  1480. }
  1481. }
  1482. /*******************************************************************************
  1483. * Function Name : SD_StopTransfer
  1484. * Description : Aborts an ongoing data transfer.
  1485. * Input : None
  1486. * Output : None
  1487. * Return : SD_Error: SD Card Error code.
  1488. *******************************************************************************/
  1489. SD_Error SD_StopTransfer(void)
  1490. {
  1491. SD_Error errorstatus = SD_OK;
  1492. /* Send CMD12 STOP_TRANSMISSION */
  1493. SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  1494. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_STOP_TRANSMISSION;
  1495. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1496. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1497. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1498. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1499. errorstatus = CmdResp1Error(SDIO_STOP_TRANSMISSION);
  1500. return(errorstatus);
  1501. }
  1502. /*******************************************************************************
  1503. * Function Name : SD_Erase
  1504. * Description : Allows to erase memory area specified for the given card.
  1505. * Input : - startaddr: the start address.
  1506. * - endaddr: the end address.
  1507. * Output : None
  1508. * Return : SD_Error: SD Card Error code.
  1509. *******************************************************************************/
  1510. SD_Error SD_Erase(u32 startaddr, u32 endaddr)
  1511. {
  1512. SD_Error errorstatus = SD_OK;
  1513. u32 delay = 0;
  1514. vu32 maxdelay = 0;
  1515. u8 cardstate = 0;
  1516. /* Check if the card coomnd class supports erase command */
  1517. if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0)
  1518. {
  1519. errorstatus = SD_REQUEST_NOT_APPLICABLE;
  1520. return(errorstatus);
  1521. }
  1522. maxdelay = 72000 / ((SDIO->CLKCR & 0xFF) + 2);
  1523. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  1524. {
  1525. errorstatus = SD_LOCK_UNLOCK_FAILED;
  1526. return(errorstatus);
  1527. }
  1528. if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  1529. {
  1530. startaddr /= 512;
  1531. endaddr /= 512;
  1532. }
  1533. /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
  1534. if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
  1535. {
  1536. /* Send CMD32 SD_ERASE_GRP_START with argument as addr */
  1537. SDIO_CmdInitStructure.SDIO_Argument = startaddr;
  1538. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_ERASE_GRP_START;
  1539. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1540. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1541. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1542. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1543. errorstatus = CmdResp1Error(SDIO_SD_ERASE_GRP_START);
  1544. if (errorstatus != SD_OK)
  1545. {
  1546. return(errorstatus);
  1547. }
  1548. /* Send CMD33 SD_ERASE_GRP_END with argument as addr */
  1549. SDIO_CmdInitStructure.SDIO_Argument = endaddr;
  1550. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_ERASE_GRP_END;
  1551. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1552. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1553. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1554. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1555. errorstatus = CmdResp1Error(SDIO_SD_ERASE_GRP_END);
  1556. if (errorstatus != SD_OK)
  1557. {
  1558. return(errorstatus);
  1559. }
  1560. }
  1561. /* Send CMD38 ERASE */
  1562. SDIO_CmdInitStructure.SDIO_Argument = 0;
  1563. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_ERASE;
  1564. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1565. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1566. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1567. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1568. errorstatus = CmdResp1Error(SDIO_ERASE);
  1569. if (errorstatus != SD_OK)
  1570. {
  1571. return(errorstatus);
  1572. }
  1573. for (delay = 0; delay < maxdelay; delay++)
  1574. {}
  1575. /* Wait till the card is in programming state */
  1576. errorstatus = IsCardProgramming(&cardstate);
  1577. while ((errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate)))
  1578. {
  1579. errorstatus = IsCardProgramming(&cardstate);
  1580. }
  1581. return(errorstatus);
  1582. }
  1583. /*******************************************************************************
  1584. * Function Name : SD_SendStatus
  1585. * Description : Returns the current card's status.
  1586. * Input : pcardstatus: pointer to the buffer that will contain the SD
  1587. * card status (Card Status register).
  1588. * Output : None
  1589. * Return : SD_Error: SD Card Error code.
  1590. *******************************************************************************/
  1591. SD_Error SD_SendStatus(u32 *pcardstatus)
  1592. {
  1593. SD_Error errorstatus = SD_OK;
  1594. if (pcardstatus == NULL)
  1595. {
  1596. errorstatus = SD_INVALID_PARAMETER;
  1597. return(errorstatus);
  1598. }
  1599. SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  1600. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS;
  1601. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1602. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1603. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1604. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1605. errorstatus = CmdResp1Error(SDIO_SEND_STATUS);
  1606. if (errorstatus != SD_OK)
  1607. {
  1608. return(errorstatus);
  1609. }
  1610. *pcardstatus = SDIO_GetResponse(SDIO_RESP1);
  1611. return(errorstatus);
  1612. }
  1613. /*******************************************************************************
  1614. * Function Name : SD_SendSDStatus
  1615. * Description : Returns the current SD card's status.
  1616. * Input : psdstatus: pointer to the buffer that will contain the SD
  1617. * card status (SD Status register).
  1618. * Output : None
  1619. * Return : SD_Error: SD Card Error code.
  1620. *******************************************************************************/
  1621. SD_Error SD_SendSDStatus(u32 *psdstatus)
  1622. {
  1623. SD_Error errorstatus = SD_OK;
  1624. u32 count = 0;
  1625. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  1626. {
  1627. errorstatus = SD_LOCK_UNLOCK_FAILED;
  1628. return(errorstatus);
  1629. }
  1630. /* Set block size for card if it is not equal to current block size for card. */
  1631. SDIO_CmdInitStructure.SDIO_Argument = 64;
  1632. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  1633. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1634. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1635. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1636. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1637. errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);
  1638. if (errorstatus != SD_OK)
  1639. {
  1640. return(errorstatus);
  1641. }
  1642. /* CMD55 */
  1643. SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  1644. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  1645. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1646. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1647. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1648. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1649. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  1650. if (errorstatus != SD_OK)
  1651. {
  1652. return(errorstatus);
  1653. }
  1654. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  1655. SDIO_DataInitStructure.SDIO_DataLength = 64;
  1656. SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_64b;
  1657. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
  1658. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  1659. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  1660. SDIO_DataConfig(&SDIO_DataInitStructure);
  1661. /* Send ACMD13 SD_APP_STAUS with argument as card's RCA.*/
  1662. SDIO_CmdInitStructure.SDIO_Argument = 0;
  1663. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_STAUS;
  1664. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  1665. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  1666. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  1667. SDIO_SendCommand(&SDIO_CmdInitStructure);
  1668. errorstatus = CmdResp1Error(SDIO_SD_APP_STAUS);
  1669. if (errorstatus != SD_OK)
  1670. {
  1671. return(errorstatus);
  1672. }
  1673. while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
  1674. {
  1675. if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
  1676. {
  1677. for (count = 0; count < 8; count++)
  1678. {
  1679. *(psdstatus + count) = SDIO_ReadData();
  1680. }
  1681. psdstatus += 8;
  1682. }
  1683. }
  1684. if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  1685. {
  1686. SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  1687. errorstatus = SD_DATA_TIMEOUT;
  1688. return(errorstatus);
  1689. }
  1690. else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  1691. {
  1692. SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  1693. errorstatus = SD_DATA_CRC_FAIL;
  1694. return(errorstatus);
  1695. }
  1696. else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
  1697. {
  1698. SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
  1699. errorstatus = SD_RX_OVERRUN;
  1700. return(errorstatus);
  1701. }
  1702. else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  1703. {
  1704. SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  1705. errorstatus = SD_START_BIT_ERR;
  1706. return(errorstatus);
  1707. }
  1708. while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
  1709. {
  1710. *psdstatus = SDIO_ReadData();
  1711. psdstatus++;
  1712. }
  1713. /* Clear all the static status flags*/
  1714. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  1715. psdstatus -= 16;
  1716. for (count = 0; count < 16; count++)
  1717. {
  1718. psdstatus[count] = ((psdstatus[count] & SD_0TO7BITS) << 24) |((psdstatus[count] & SD_8TO15BITS) << 8) |
  1719. ((psdstatus[count] & SD_16TO23BITS) >> 8) |((psdstatus[count] & SD_24TO31BITS) >> 24);
  1720. }
  1721. return(errorstatus);
  1722. }
  1723. /*******************************************************************************
  1724. * Function Name : SD_ProcessIRQSrc
  1725. * Description : Allows to process all the interrupts that are high.
  1726. * Input : None
  1727. * Output : None
  1728. * Return : SD_Error: SD Card Error code.
  1729. *******************************************************************************/
  1730. SD_Error SD_ProcessIRQSrc(void)
  1731. {
  1732. u32 count = 0, restwords = 0;
  1733. if (DeviceMode == SD_INTERRUPT_MODE)
  1734. {
  1735. if (SDIO_GetITStatus(SDIO_IT_RXFIFOHF) != RESET)
  1736. {
  1737. for (count = 0; count < SD_HALFFIFO; count++)
  1738. {
  1739. *(DestBuffer + count) = SDIO_ReadData();
  1740. }
  1741. DestBuffer += SD_HALFFIFO;
  1742. NumberOfBytes += SD_HALFFIFOBYTES;
  1743. }
  1744. else if (SDIO_GetITStatus(SDIO_IT_TXFIFOHE) != RESET)
  1745. {
  1746. if ((TotalNumberOfBytes - NumberOfBytes) < SD_HALFFIFOBYTES)
  1747. {
  1748. restwords = ((TotalNumberOfBytes - NumberOfBytes) % 4 == 0) ?
  1749. ((TotalNumberOfBytes - NumberOfBytes) / 4) :
  1750. ((TotalNumberOfBytes - NumberOfBytes) / 4 + 1);
  1751. for (count = 0; count < restwords; count++, SrcBuffer++, NumberOfBytes += 4)
  1752. {
  1753. SDIO_WriteData(*SrcBuffer);
  1754. }
  1755. }
  1756. else
  1757. {
  1758. for (count = 0; count < SD_HALFFIFO; count++)
  1759. {
  1760. SDIO_WriteData(*(SrcBuffer + count));
  1761. }
  1762. SrcBuffer += SD_HALFFIFO;
  1763. NumberOfBytes += SD_HALFFIFOBYTES;
  1764. }
  1765. }
  1766. }
  1767. if (SDIO_GetITStatus(SDIO_IT_DATAEND) != RESET)
  1768. {
  1769. if (DeviceMode != SD_DMA_MODE)
  1770. {
  1771. while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) && (NumberOfBytes < TotalNumberOfBytes))
  1772. {
  1773. *DestBuffer = SDIO_ReadData();
  1774. DestBuffer++;
  1775. NumberOfBytes += 4;
  1776. }
  1777. }
  1778. if (StopCondition == 1)
  1779. {
  1780. TransferError = SD_StopTransfer();
  1781. }
  1782. else
  1783. {
  1784. TransferError = SD_OK;
  1785. }
  1786. SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
  1787. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
  1788. SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
  1789. SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
  1790. TransferEnd = 1;
  1791. NumberOfBytes = 0;
  1792. return(TransferError);
  1793. }
  1794. if (SDIO_GetITStatus(SDIO_IT_DCRCFAIL) != RESET)
  1795. {
  1796. SDIO_ClearITPendingBit(SDIO_IT_DCRCFAIL);
  1797. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
  1798. SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
  1799. SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
  1800. NumberOfBytes = 0;
  1801. TransferError = SD_DATA_CRC_FAIL;
  1802. return(SD_DATA_CRC_FAIL);
  1803. }
  1804. if (SDIO_GetITStatus(SDIO_IT_DTIMEOUT) != RESET)
  1805. {
  1806. SDIO_ClearITPendingBit(SDIO_IT_DTIMEOUT);
  1807. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
  1808. SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
  1809. SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
  1810. NumberOfBytes = 0;
  1811. TransferError = SD_DATA_TIMEOUT;
  1812. return(SD_DATA_TIMEOUT);
  1813. }
  1814. if (SDIO_GetITStatus(SDIO_IT_RXOVERR) != RESET)
  1815. {
  1816. SDIO_ClearITPendingBit(SDIO_IT_RXOVERR);
  1817. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
  1818. SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
  1819. SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
  1820. NumberOfBytes = 0;
  1821. TransferError = SD_RX_OVERRUN;
  1822. return(SD_RX_OVERRUN);
  1823. }
  1824. if (SDIO_GetITStatus(SDIO_IT_TXUNDERR) != RESET)
  1825. {
  1826. SDIO_ClearITPendingBit(SDIO_IT_TXUNDERR);
  1827. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
  1828. SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
  1829. SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
  1830. NumberOfBytes = 0;
  1831. TransferError = SD_TX_UNDERRUN;
  1832. return(SD_TX_UNDERRUN);
  1833. }
  1834. if (SDIO_GetITStatus(SDIO_IT_STBITERR) != RESET)
  1835. {
  1836. SDIO_ClearITPendingBit(SDIO_IT_STBITERR);
  1837. SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
  1838. SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
  1839. SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
  1840. NumberOfBytes = 0;
  1841. TransferError = SD_START_BIT_ERR;
  1842. return(SD_START_BIT_ERR);
  1843. }
  1844. return(SD_OK);
  1845. }
  1846. /*******************************************************************************
  1847. * Function Name : CmdError
  1848. * Description : Checks for error conditions for CMD0.
  1849. * Input : None
  1850. * Output : None
  1851. * Return : SD_Error: SD Card Error code.
  1852. *******************************************************************************/
  1853. static SD_Error CmdError(void)
  1854. {
  1855. SD_Error errorstatus = SD_OK;
  1856. u32 timeout;
  1857. timeout = SDIO_CMD0TIMEOUT; /* 10000 */
  1858. while ((timeout > 0) && (SDIO_GetFlagStatus(SDIO_FLAG_CMDSENT) == RESET))
  1859. {
  1860. timeout--;
  1861. }
  1862. if (timeout == 0)
  1863. {
  1864. errorstatus = SD_CMD_RSP_TIMEOUT;
  1865. return(errorstatus);
  1866. }
  1867. /* Clear all the static flags */
  1868. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  1869. return(errorstatus);
  1870. }
  1871. /*******************************************************************************
  1872. * Function Name : CmdResp7Error
  1873. * Description : Checks for error conditions for R7.
  1874. * response.
  1875. * Input : None
  1876. * Output : None
  1877. * Return : SD_Error: SD Card Error code.
  1878. *******************************************************************************/
  1879. static SD_Error CmdResp7Error(void)
  1880. {
  1881. SD_Error errorstatus = SD_OK;
  1882. u32 status;
  1883. u32 timeout = SDIO_CMD0TIMEOUT;
  1884. status = SDIO->STA;
  1885. while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) && (timeout > 0))
  1886. {
  1887. timeout--;
  1888. status = SDIO->STA;
  1889. }
  1890. if ((timeout == 0) || (status & SDIO_FLAG_CTIMEOUT))
  1891. {
  1892. /* Card is not V2.0 complient or card does not support the set voltage range */
  1893. errorstatus = SD_CMD_RSP_TIMEOUT;
  1894. SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
  1895. return(errorstatus);
  1896. }
  1897. if (status & SDIO_FLAG_CMDREND)
  1898. {
  1899. /* Card is SD V2.0 compliant */
  1900. errorstatus = SD_OK;
  1901. SDIO_ClearFlag(SDIO_FLAG_CMDREND);
  1902. return(errorstatus);
  1903. }
  1904. return(errorstatus);
  1905. }
  1906. /*******************************************************************************
  1907. * Function Name : CmdResp1Error
  1908. * Description : Checks for error conditions for R1.
  1909. * response
  1910. * Input : cmd: The sent command index.
  1911. * Output : None
  1912. * Return : SD_Error: SD Card Error code.
  1913. *******************************************************************************/
  1914. static SD_Error CmdResp1Error(u8 cmd)
  1915. {
  1916. SD_Error errorstatus = SD_OK;
  1917. u32 status;
  1918. u32 response_r1;
  1919. status = SDIO->STA;
  1920. while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  1921. {
  1922. status = SDIO->STA;
  1923. }
  1924. if (status & SDIO_FLAG_CTIMEOUT)
  1925. {
  1926. errorstatus = SD_CMD_RSP_TIMEOUT;
  1927. SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
  1928. return(errorstatus);
  1929. }
  1930. else if (status & SDIO_FLAG_CCRCFAIL)
  1931. {
  1932. errorstatus = SD_CMD_CRC_FAIL;
  1933. SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
  1934. return(errorstatus);
  1935. }
  1936. /* Check response received is of desired command */
  1937. if (SDIO_GetCommandResponse() != cmd)
  1938. {
  1939. errorstatus = SD_ILLEGAL_CMD;
  1940. return(errorstatus);
  1941. }
  1942. /* Clear all the static flags */
  1943. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  1944. /* We have received response, retrieve it for analysis */
  1945. response_r1 = SDIO_GetResponse(SDIO_RESP1);
  1946. if ((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
  1947. {
  1948. return(errorstatus);
  1949. }
  1950. if (response_r1 & SD_OCR_ADDR_OUT_OF_RANGE)
  1951. {
  1952. return(SD_ADDR_OUT_OF_RANGE);
  1953. }
  1954. if (response_r1 & SD_OCR_ADDR_MISALIGNED)
  1955. {
  1956. return(SD_ADDR_MISALIGNED);
  1957. }
  1958. if (response_r1 & SD_OCR_BLOCK_LEN_ERR)
  1959. {
  1960. return(SD_BLOCK_LEN_ERR);
  1961. }
  1962. if (response_r1 & SD_OCR_ERASE_SEQ_ERR)
  1963. {
  1964. return(SD_ERASE_SEQ_ERR);
  1965. }
  1966. if (response_r1 & SD_OCR_BAD_ERASE_PARAM)
  1967. {
  1968. return(SD_BAD_ERASE_PARAM);
  1969. }
  1970. if (response_r1 & SD_OCR_WRITE_PROT_VIOLATION)
  1971. {
  1972. return(SD_WRITE_PROT_VIOLATION);
  1973. }
  1974. if (response_r1 & SD_OCR_LOCK_UNLOCK_FAILED)
  1975. {
  1976. return(SD_LOCK_UNLOCK_FAILED);
  1977. }
  1978. if (response_r1 & SD_OCR_COM_CRC_FAILED)
  1979. {
  1980. return(SD_COM_CRC_FAILED);
  1981. }
  1982. if (response_r1 & SD_OCR_ILLEGAL_CMD)
  1983. {
  1984. return(SD_ILLEGAL_CMD);
  1985. }
  1986. if (response_r1 & SD_OCR_CARD_ECC_FAILED)
  1987. {
  1988. return(SD_CARD_ECC_FAILED);
  1989. }
  1990. if (response_r1 & SD_OCR_CC_ERROR)
  1991. {
  1992. return(SD_CC_ERROR);
  1993. }
  1994. if (response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR)
  1995. {
  1996. return(SD_GENERAL_UNKNOWN_ERROR);
  1997. }
  1998. if (response_r1 & SD_OCR_STREAM_READ_UNDERRUN)
  1999. {
  2000. return(SD_STREAM_READ_UNDERRUN);
  2001. }
  2002. if (response_r1 & SD_OCR_STREAM_WRITE_OVERRUN)
  2003. {
  2004. return(SD_STREAM_WRITE_OVERRUN);
  2005. }
  2006. if (response_r1 & SD_OCR_CID_CSD_OVERWRIETE)
  2007. {
  2008. return(SD_CID_CSD_OVERWRITE);
  2009. }
  2010. if (response_r1 & SD_OCR_WP_ERASE_SKIP)
  2011. {
  2012. return(SD_WP_ERASE_SKIP);
  2013. }
  2014. if (response_r1 & SD_OCR_CARD_ECC_DISABLED)
  2015. {
  2016. return(SD_CARD_ECC_DISABLED);
  2017. }
  2018. if (response_r1 & SD_OCR_ERASE_RESET)
  2019. {
  2020. return(SD_ERASE_RESET);
  2021. }
  2022. if (response_r1 & SD_OCR_AKE_SEQ_ERROR)
  2023. {
  2024. return(SD_AKE_SEQ_ERROR);
  2025. }
  2026. return(errorstatus);
  2027. }
  2028. /*******************************************************************************
  2029. * Function Name : CmdResp3Error
  2030. * Description : Checks for error conditions for R3 (OCR).
  2031. * response.
  2032. * Input : None
  2033. * Output : None
  2034. * Return : SD_Error: SD Card Error code.
  2035. *******************************************************************************/
  2036. static SD_Error CmdResp3Error(void)
  2037. {
  2038. SD_Error errorstatus = SD_OK;
  2039. u32 status;
  2040. status = SDIO->STA;
  2041. while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  2042. {
  2043. status = SDIO->STA;
  2044. }
  2045. if (status & SDIO_FLAG_CTIMEOUT)
  2046. {
  2047. errorstatus = SD_CMD_RSP_TIMEOUT;
  2048. SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
  2049. return(errorstatus);
  2050. }
  2051. /* Clear all the static flags */
  2052. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  2053. return(errorstatus);
  2054. }
  2055. /*******************************************************************************
  2056. * Function Name : CmdResp2Error
  2057. * Description : Checks for error conditions for R2 (CID or CSD).
  2058. * response.
  2059. * Input : None
  2060. * Output : None
  2061. * Return : SD_Error: SD Card Error code.
  2062. *******************************************************************************/
  2063. static SD_Error CmdResp2Error(void)
  2064. {
  2065. SD_Error errorstatus = SD_OK;
  2066. u32 status;
  2067. status = SDIO->STA;
  2068. while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CTIMEOUT | SDIO_FLAG_CMDREND)))
  2069. {
  2070. status = SDIO->STA;
  2071. }
  2072. if (status & SDIO_FLAG_CTIMEOUT)
  2073. {
  2074. errorstatus = SD_CMD_RSP_TIMEOUT;
  2075. SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
  2076. return(errorstatus);
  2077. }
  2078. else if (status & SDIO_FLAG_CCRCFAIL)
  2079. {
  2080. errorstatus = SD_CMD_CRC_FAIL;
  2081. SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
  2082. return(errorstatus);
  2083. }
  2084. /* Clear all the static flags */
  2085. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  2086. return(errorstatus);
  2087. }
  2088. /*******************************************************************************
  2089. * Function Name : CmdResp6Error
  2090. * Description : Checks for error conditions for R6 (RCA).
  2091. * response.
  2092. * Input : - cmd: The sent command index.
  2093. * - prca: pointer to the variable that will contain the SD
  2094. * card relative address RCA.
  2095. * Output : None
  2096. * Return : SD_Error: SD Card Error code.
  2097. *******************************************************************************/
  2098. static SD_Error CmdResp6Error(u8 cmd, u16 *prca)
  2099. {
  2100. SD_Error errorstatus = SD_OK;
  2101. u32 status;
  2102. u32 response_r1;
  2103. status = SDIO->STA;
  2104. while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CTIMEOUT | SDIO_FLAG_CMDREND)))
  2105. {
  2106. status = SDIO->STA;
  2107. }
  2108. if (status & SDIO_FLAG_CTIMEOUT)
  2109. {
  2110. errorstatus = SD_CMD_RSP_TIMEOUT;
  2111. SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
  2112. return(errorstatus);
  2113. }
  2114. else if (status & SDIO_FLAG_CCRCFAIL)
  2115. {
  2116. errorstatus = SD_CMD_CRC_FAIL;
  2117. SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
  2118. return(errorstatus);
  2119. }
  2120. /* Check response received is of desired command */
  2121. if (SDIO_GetCommandResponse() != cmd)
  2122. {
  2123. errorstatus = SD_ILLEGAL_CMD;
  2124. return(errorstatus);
  2125. }
  2126. /* Clear all the static flags */
  2127. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  2128. /* We have received response, retrieve it. */
  2129. response_r1 = SDIO_GetResponse(SDIO_RESP1);
  2130. if (SD_ALLZERO == (response_r1 & (SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD | SD_R6_COM_CRC_FAILED)))
  2131. {
  2132. *prca = (u16) (response_r1 >> 16);
  2133. return(errorstatus);
  2134. }
  2135. if (response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR)
  2136. {
  2137. return(SD_GENERAL_UNKNOWN_ERROR);
  2138. }
  2139. if (response_r1 & SD_R6_ILLEGAL_CMD)
  2140. {
  2141. return(SD_ILLEGAL_CMD);
  2142. }
  2143. if (response_r1 & SD_R6_COM_CRC_FAILED)
  2144. {
  2145. return(SD_COM_CRC_FAILED);
  2146. }
  2147. return(errorstatus);
  2148. }
  2149. /*******************************************************************************
  2150. * Function Name : SDEnWideBus
  2151. * Description : Enables or disables the SDIO wide bus mode.
  2152. * Input : NewState: new state of the SDIO wide bus mode.
  2153. * This parameter can be: ENABLE or DISABLE.
  2154. * Output : None
  2155. * Return : SD_Error: SD Card Error code.
  2156. *******************************************************************************/
  2157. static SD_Error SDEnWideBus(FunctionalState NewState)
  2158. {
  2159. SD_Error errorstatus = SD_OK;
  2160. u32 scr[2] = {0, 0};
  2161. if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
  2162. {
  2163. errorstatus = SD_LOCK_UNLOCK_FAILED;
  2164. return(errorstatus);
  2165. }
  2166. /* Get SCR Register */
  2167. errorstatus = FindSCR(RCA, scr);
  2168. if (errorstatus != SD_OK)
  2169. {
  2170. return(errorstatus);
  2171. }
  2172. /* If wide bus operation to be enabled */
  2173. if (NewState == ENABLE)
  2174. {
  2175. /* If requested card supports wide bus operation */
  2176. if ((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO)
  2177. {
  2178. /* Send CMD55 APP_CMD with argument as card's RCA.*/
  2179. SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  2180. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  2181. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2182. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2183. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2184. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2185. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  2186. if (errorstatus != SD_OK)
  2187. {
  2188. return(errorstatus);
  2189. }
  2190. /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
  2191. SDIO_CmdInitStructure.SDIO_Argument = 0x2;
  2192. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH;
  2193. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2194. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2195. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2196. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2197. errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH);
  2198. if (errorstatus != SD_OK)
  2199. {
  2200. return(errorstatus);
  2201. }
  2202. return(errorstatus);
  2203. }
  2204. else
  2205. {
  2206. errorstatus = SD_REQUEST_NOT_APPLICABLE;
  2207. return(errorstatus);
  2208. }
  2209. } /* If wide bus operation to be disabled */
  2210. else
  2211. {
  2212. /* If requested card supports 1 bit mode operation */
  2213. if ((scr[1] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO)
  2214. {
  2215. /* Send CMD55 APP_CMD with argument as card's RCA.*/
  2216. SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  2217. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  2218. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2219. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2220. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2221. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2222. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  2223. if (errorstatus != SD_OK)
  2224. {
  2225. return(errorstatus);
  2226. }
  2227. /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */
  2228. SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  2229. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_SD_SET_BUSWIDTH;
  2230. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2231. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2232. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2233. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2234. errorstatus = CmdResp1Error(SDIO_APP_SD_SET_BUSWIDTH);
  2235. if (errorstatus != SD_OK)
  2236. {
  2237. return(errorstatus);
  2238. }
  2239. return(errorstatus);
  2240. }
  2241. else
  2242. {
  2243. errorstatus = SD_REQUEST_NOT_APPLICABLE;
  2244. return(errorstatus);
  2245. }
  2246. }
  2247. }
  2248. /*******************************************************************************
  2249. * Function Name : IsCardProgramming
  2250. * Description : Checks if the SD card is in programming state.
  2251. * Input : pstatus: pointer to the variable that will contain the SD
  2252. * card state.
  2253. * Output : None
  2254. * Return : SD_Error: SD Card Error code.
  2255. *******************************************************************************/
  2256. static SD_Error IsCardProgramming(u8 *pstatus)
  2257. {
  2258. SD_Error errorstatus = SD_OK;
  2259. vu32 respR1 = 0, status = 0;
  2260. SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  2261. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_STATUS;
  2262. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2263. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2264. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2265. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2266. status = SDIO->STA;
  2267. while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)))
  2268. {
  2269. status = SDIO->STA;
  2270. }
  2271. if (status & SDIO_FLAG_CTIMEOUT)
  2272. {
  2273. errorstatus = SD_CMD_RSP_TIMEOUT;
  2274. SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);
  2275. return(errorstatus);
  2276. }
  2277. else if (status & SDIO_FLAG_CCRCFAIL)
  2278. {
  2279. errorstatus = SD_CMD_CRC_FAIL;
  2280. SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
  2281. return(errorstatus);
  2282. }
  2283. status = (u32)SDIO_GetCommandResponse();
  2284. /* Check response received is of desired command */
  2285. if (status != SDIO_SEND_STATUS)
  2286. {
  2287. errorstatus = SD_ILLEGAL_CMD;
  2288. return(errorstatus);
  2289. }
  2290. /* Clear all the static flags */
  2291. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  2292. /* We have received response, retrieve it for analysis */
  2293. respR1 = SDIO_GetResponse(SDIO_RESP1);
  2294. /* Find out card status */
  2295. *pstatus = (u8) ((respR1 >> 9) & 0x0000000F);
  2296. if ((respR1 & SD_OCR_ERRORBITS) == SD_ALLZERO)
  2297. {
  2298. return(errorstatus);
  2299. }
  2300. if (respR1 & SD_OCR_ADDR_OUT_OF_RANGE)
  2301. {
  2302. return(SD_ADDR_OUT_OF_RANGE);
  2303. }
  2304. if (respR1 & SD_OCR_ADDR_MISALIGNED)
  2305. {
  2306. return(SD_ADDR_MISALIGNED);
  2307. }
  2308. if (respR1 & SD_OCR_BLOCK_LEN_ERR)
  2309. {
  2310. return(SD_BLOCK_LEN_ERR);
  2311. }
  2312. if (respR1 & SD_OCR_ERASE_SEQ_ERR)
  2313. {
  2314. return(SD_ERASE_SEQ_ERR);
  2315. }
  2316. if (respR1 & SD_OCR_BAD_ERASE_PARAM)
  2317. {
  2318. return(SD_BAD_ERASE_PARAM);
  2319. }
  2320. if (respR1 & SD_OCR_WRITE_PROT_VIOLATION)
  2321. {
  2322. return(SD_WRITE_PROT_VIOLATION);
  2323. }
  2324. if (respR1 & SD_OCR_LOCK_UNLOCK_FAILED)
  2325. {
  2326. return(SD_LOCK_UNLOCK_FAILED);
  2327. }
  2328. if (respR1 & SD_OCR_COM_CRC_FAILED)
  2329. {
  2330. return(SD_COM_CRC_FAILED);
  2331. }
  2332. if (respR1 & SD_OCR_ILLEGAL_CMD)
  2333. {
  2334. return(SD_ILLEGAL_CMD);
  2335. }
  2336. if (respR1 & SD_OCR_CARD_ECC_FAILED)
  2337. {
  2338. return(SD_CARD_ECC_FAILED);
  2339. }
  2340. if (respR1 & SD_OCR_CC_ERROR)
  2341. {
  2342. return(SD_CC_ERROR);
  2343. }
  2344. if (respR1 & SD_OCR_GENERAL_UNKNOWN_ERROR)
  2345. {
  2346. return(SD_GENERAL_UNKNOWN_ERROR);
  2347. }
  2348. if (respR1 & SD_OCR_STREAM_READ_UNDERRUN)
  2349. {
  2350. return(SD_STREAM_READ_UNDERRUN);
  2351. }
  2352. if (respR1 & SD_OCR_STREAM_WRITE_OVERRUN)
  2353. {
  2354. return(SD_STREAM_WRITE_OVERRUN);
  2355. }
  2356. if (respR1 & SD_OCR_CID_CSD_OVERWRIETE)
  2357. {
  2358. return(SD_CID_CSD_OVERWRITE);
  2359. }
  2360. if (respR1 & SD_OCR_WP_ERASE_SKIP)
  2361. {
  2362. return(SD_WP_ERASE_SKIP);
  2363. }
  2364. if (respR1 & SD_OCR_CARD_ECC_DISABLED)
  2365. {
  2366. return(SD_CARD_ECC_DISABLED);
  2367. }
  2368. if (respR1 & SD_OCR_ERASE_RESET)
  2369. {
  2370. return(SD_ERASE_RESET);
  2371. }
  2372. if (respR1 & SD_OCR_AKE_SEQ_ERROR)
  2373. {
  2374. return(SD_AKE_SEQ_ERROR);
  2375. }
  2376. return(errorstatus);
  2377. }
  2378. /*******************************************************************************
  2379. * Function Name : FindSCR
  2380. * Description : Find the SD card SCR register value.
  2381. * Input : - rca: selected card address.
  2382. * - pscr: pointer to the buffer that will contain the SCR value.
  2383. * Output : None
  2384. * Return : SD_Error: SD Card Error code.
  2385. *******************************************************************************/
  2386. static SD_Error FindSCR(u16 rca, u32 *pscr)
  2387. {
  2388. u32 index = 0;
  2389. SD_Error errorstatus = SD_OK;
  2390. u32 tempscr[2] = {0, 0};
  2391. /* Set Block Size To 8 Bytes */
  2392. /* Send CMD55 APP_CMD with argument as card's RCA */
  2393. SDIO_CmdInitStructure.SDIO_Argument = (u32)8;
  2394. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SET_BLOCKLEN;
  2395. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2396. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2397. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2398. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2399. errorstatus = CmdResp1Error(SDIO_SET_BLOCKLEN);
  2400. if (errorstatus != SD_OK)
  2401. {
  2402. return(errorstatus);
  2403. }
  2404. /* Send CMD55 APP_CMD with argument as card's RCA */
  2405. SDIO_CmdInitStructure.SDIO_Argument = (u32) RCA << 16;
  2406. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  2407. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2408. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2409. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2410. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2411. errorstatus = CmdResp1Error(SDIO_APP_CMD);
  2412. if (errorstatus != SD_OK)
  2413. {
  2414. return(errorstatus);
  2415. }
  2416. SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;
  2417. SDIO_DataInitStructure.SDIO_DataLength = 8;
  2418. SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_8b;
  2419. SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;
  2420. SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;
  2421. SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;
  2422. SDIO_DataConfig(&SDIO_DataInitStructure);
  2423. /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */
  2424. SDIO_CmdInitStructure.SDIO_Argument = 0x0;
  2425. SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_SEND_SCR;
  2426. SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  2427. SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  2428. SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  2429. SDIO_SendCommand(&SDIO_CmdInitStructure);
  2430. errorstatus = CmdResp1Error(SDIO_SD_APP_SEND_SCR);
  2431. if (errorstatus != SD_OK)
  2432. {
  2433. return(errorstatus);
  2434. }
  2435. while (!(SDIO->STA & (SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)))
  2436. {
  2437. if (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET)
  2438. {
  2439. *(tempscr + index) = SDIO_ReadData();
  2440. index++;
  2441. }
  2442. }
  2443. if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET)
  2444. {
  2445. SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);
  2446. errorstatus = SD_DATA_TIMEOUT;
  2447. return(errorstatus);
  2448. }
  2449. else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET)
  2450. {
  2451. SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);
  2452. errorstatus = SD_DATA_CRC_FAIL;
  2453. return(errorstatus);
  2454. }
  2455. else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET)
  2456. {
  2457. SDIO_ClearFlag(SDIO_FLAG_RXOVERR);
  2458. errorstatus = SD_RX_OVERRUN;
  2459. return(errorstatus);
  2460. }
  2461. else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET)
  2462. {
  2463. SDIO_ClearFlag(SDIO_FLAG_STBITERR);
  2464. errorstatus = SD_START_BIT_ERR;
  2465. return(errorstatus);
  2466. }
  2467. /* Clear all the static flags */
  2468. SDIO_ClearFlag(SDIO_STATIC_FLAGS);
  2469. *(pscr + 1) = ((tempscr[0] & SD_0TO7BITS) << 24) | ((tempscr[0] & SD_8TO15BITS) << 8) | ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24);
  2470. *(pscr) = ((tempscr[1] & SD_0TO7BITS) << 24) | ((tempscr[1] & SD_8TO15BITS) << 8) | ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24);
  2471. return(errorstatus);
  2472. }
  2473. /*******************************************************************************
  2474. * Function Name : convert_from_bytes_to_power_of_two
  2475. * Description : Converts the number of bytes in power of two and returns the
  2476. * power.
  2477. * Input : NumberOfBytes: number of bytes.
  2478. * Output : None
  2479. * Return : None
  2480. *******************************************************************************/
  2481. static u8 convert_from_bytes_to_power_of_two(u16 NumberOfBytes)
  2482. {
  2483. u8 count = 0;
  2484. while (NumberOfBytes != 1)
  2485. {
  2486. NumberOfBytes >>= 1;
  2487. count++;
  2488. }
  2489. return(count);
  2490. }
  2491. /*******************************************************************************
  2492. * Function Name : GPIO_Configuration
  2493. * Description : Configures the SDIO Corresponding GPIO Ports
  2494. * Input : None
  2495. * Output : None
  2496. * Return : None
  2497. *******************************************************************************/
  2498. static void GPIO_Configuration(void)
  2499. {
  2500. GPIO_InitTypeDef GPIO_InitStructure;
  2501. /* GPIOC and GPIOD Periph clock enable */
  2502. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
  2503. /* Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
  2504. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
  2505. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  2506. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  2507. GPIO_Init(GPIOC, &GPIO_InitStructure);
  2508. /* Configure PD.02 CMD line */
  2509. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  2510. GPIO_Init(GPIOD, &GPIO_InitStructure);
  2511. }
  2512. /*******************************************************************************
  2513. * Function Name : DMA_TxConfiguration
  2514. * Description : Configures the DMA2 Channel4 for SDIO Tx request.
  2515. * Input : - BufferSRC: pointer to the source buffer
  2516. * - BufferSize: buffer size
  2517. * Output : None
  2518. * Return : None
  2519. *******************************************************************************/
  2520. static void DMA_TxConfiguration(u32 *BufferSRC, u32 BufferSize)
  2521. {
  2522. DMA_InitTypeDef DMA_InitStructure;
  2523. DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);
  2524. /* DMA2 Channel4 disable */
  2525. DMA_Cmd(DMA2_Channel4, DISABLE);
  2526. /* DMA2 Channel4 Config */
  2527. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SDIO_FIFO_Address;
  2528. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)BufferSRC;
  2529. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  2530. DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
  2531. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  2532. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  2533. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  2534. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  2535. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  2536. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  2537. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  2538. DMA_Init(DMA2_Channel4, &DMA_InitStructure);
  2539. /* DMA2 Channel4 enable */
  2540. DMA_Cmd(DMA2_Channel4, ENABLE);
  2541. }
  2542. /*******************************************************************************
  2543. * Function Name : DMA_RxConfiguration
  2544. * Description : Configures the DMA2 Channel4 for SDIO Rx request.
  2545. * Input : - BufferDST: pointer to the destination buffer
  2546. * - BufferSize: buffer size
  2547. * Output : None
  2548. * Return : None
  2549. *******************************************************************************/
  2550. static void DMA_RxConfiguration(u32 *BufferDST, u32 BufferSize)
  2551. {
  2552. DMA_InitTypeDef DMA_InitStructure;
  2553. DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);
  2554. /* DMA2 Channel4 disable */
  2555. DMA_Cmd(DMA2_Channel4, DISABLE);
  2556. /* DMA2 Channel4 Config */
  2557. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SDIO_FIFO_Address;
  2558. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)BufferDST;
  2559. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  2560. DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
  2561. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  2562. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  2563. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  2564. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  2565. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  2566. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  2567. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  2568. DMA_Init(DMA2_Channel4, &DMA_InitStructure);
  2569. /* DMA2 Channel4 enable */
  2570. DMA_Cmd(DMA2_Channel4, ENABLE);
  2571. }
  2572. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
  2573. /*
  2574. * RT-Thread SD Card Driver
  2575. * 20090417 Bernard
  2576. */
  2577. #include <rtthread.h>
  2578. #include <dfs_fs.h>
  2579. struct rt_device sdcard_device;
  2580. SD_CardInfo SDCardInfo;
  2581. struct dfs_partition part;
  2582. /* RT-Thread Device Driver Interface */
  2583. static rt_err_t rt_sdcard_init(rt_device_t dev)
  2584. {
  2585. NVIC_InitTypeDef NVIC_InitStructure;
  2586. NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  2587. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  2588. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  2589. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  2590. NVIC_Init(&NVIC_InitStructure);
  2591. return RT_EOK;
  2592. }
  2593. static rt_err_t rt_sdcard_open(rt_device_t dev, rt_uint16_t oflag)
  2594. {
  2595. return RT_EOK;
  2596. }
  2597. static rt_err_t rt_sdcard_close(rt_device_t dev)
  2598. {
  2599. return RT_EOK;
  2600. }
  2601. /* set sector size to 512 */
  2602. #define SECTOR_SIZE 512
  2603. static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  2604. {
  2605. SD_Error status;
  2606. rt_uint32_t i;
  2607. // rt_kprintf("read: 0x%x, size %d\n", pos, size);
  2608. /* read all sectors */
  2609. for (i = 0; i < size / SECTOR_SIZE; i ++)
  2610. {
  2611. status = SD_ReadBlock((part.offset + i)* SECTOR_SIZE + pos,
  2612. (rt_uint32_t*)((rt_uint8_t*)buffer + i * SECTOR_SIZE),
  2613. SECTOR_SIZE);
  2614. if (status != SD_OK)
  2615. {
  2616. rt_kprintf("sd card read failed\n");
  2617. return 0;
  2618. }
  2619. }
  2620. if (status == SD_OK) return size;
  2621. rt_kprintf("read failed: %d\n", status);
  2622. return 0;
  2623. }
  2624. static rt_size_t rt_sdcard_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  2625. {
  2626. SD_Error status;
  2627. rt_uint32_t i;
  2628. // rt_kprintf("write: 0x%x, size %d\n", pos, size);
  2629. /* read all sectors */
  2630. for (i = 0; i < size / SECTOR_SIZE; i ++)
  2631. {
  2632. status = SD_WriteBlock((part.offset + i)* SECTOR_SIZE + pos,
  2633. (rt_uint32_t*)((rt_uint8_t*)buffer + i * SECTOR_SIZE),
  2634. SECTOR_SIZE);
  2635. if (status != SD_OK)
  2636. {
  2637. rt_kprintf("sd card write failed\n");
  2638. return 0;
  2639. }
  2640. }
  2641. if (status == SD_OK) return size;
  2642. rt_kprintf("write failed: %d\n", status);
  2643. return 0;
  2644. }
  2645. static rt_err_t rt_sdcard_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  2646. {
  2647. return RT_EOK;
  2648. }
  2649. void rt_hw_sdcard_init()
  2650. {
  2651. if (SD_Init())
  2652. {
  2653. SD_Error status;
  2654. rt_uint8_t *sector;
  2655. status = SD_GetCardInfo(&SDCardInfo);
  2656. if (status != SD_OK) goto __return;
  2657. status = SD_SelectDeselect((u32) (SDCardInfo.RCA << 16));
  2658. if (status != SD_OK) goto __return;
  2659. SD_EnableWideBusOperation(SDIO_BusWide_4b);
  2660. SD_SetDeviceMode(SD_DMA_MODE);
  2661. /* get the first sector to read partition table */
  2662. sector = (rt_uint8_t*) rt_malloc (512);
  2663. if (sector == RT_NULL)
  2664. {
  2665. rt_kprintf("allocate partition sector buffer failed\n");
  2666. return;
  2667. }
  2668. status = SD_ReadBlock(0, (rt_uint32_t*)sector, 512);
  2669. if (status == SD_OK)
  2670. {
  2671. /* get the first partition */
  2672. if (dfs_filesystem_get_partition(&part, sector, 0) != 0)
  2673. {
  2674. /* there is no partition */
  2675. part.offset = 0;
  2676. part.size = 0;
  2677. }
  2678. }
  2679. else
  2680. {
  2681. /* there is no partition table */
  2682. part.offset = 0;
  2683. part.size = 0;
  2684. }
  2685. /* release sector buffer */
  2686. rt_free(sector);
  2687. /* register sdcard device */
  2688. sdcard_device.init = rt_sdcard_init;
  2689. sdcard_device.open = rt_sdcard_open;
  2690. sdcard_device.close = rt_sdcard_close;
  2691. sdcard_device.read = rt_sdcard_read;
  2692. sdcard_device.write = rt_sdcard_write;
  2693. sdcard_device.control = rt_sdcard_control;
  2694. /* no private */
  2695. sdcard_device.private = RT_NULL;
  2696. rt_device_register(&sdcard_device, "sd0",
  2697. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE);
  2698. return;
  2699. }
  2700. __return:
  2701. rt_kprintf("sdcard init failed\n");
  2702. }