apm32f10x_emmc.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. /*!
  2. * @file apm32f10x_emmc.c
  3. *
  4. * @brief This file provides all the EMMC firmware functions
  5. *
  6. * @version V1.0.2
  7. *
  8. * @date 2022-01-05
  9. *
  10. * @attention
  11. *
  12. * Copyright (C) 2020-2022 Geehy Semiconductor
  13. *
  14. * You may not use this file except in compliance with the
  15. * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE).
  16. *
  17. * The program is only for reference, which is distributed in the hope
  18. * that it will be usefull and instructional for customers to develop
  19. * their software. Unless required by applicable law or agreed to in
  20. * writing, the program is distributed on an "AS IS" BASIS, WITHOUT
  21. * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied.
  22. * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions
  23. * and limitations under the License.
  24. */
  25. #include "apm32f10x_emmc.h"
  26. #include "apm32f10x_rcm.h"
  27. /** @addtogroup Peripherals_Library Standard Peripheral Library
  28. @{
  29. */
  30. /** @addtogroup EMMC_Driver EMMC Driver
  31. @{
  32. */
  33. /** @addtogroup EMMC_Fuctions Fuctions
  34. @{
  35. */
  36. /*!
  37. * @brief Rest the EMMMC NOR/SRAM Banks registers
  38. *
  39. * @param bank: Selects the EMMMC Bank.
  40. * The parameter can be one of following values:
  41. * @arg EMMC_BANK1_NORSRAM_1: EMMC Bank1 NOR/SRAM1
  42. * @arg EMMC_BANK1_NORSRAM_2: EMMC Bank1 NOR/SRAM2
  43. * @arg EMMC_BANK1_NORSRAM_3: EMMC Bank1 NOR/SRAM3
  44. * @arg EMMC_BANK1_NORSRAM_4: EMMC Bank1 NOR/SRAM4
  45. *
  46. * @retval None
  47. */
  48. void EMMC_ResetNORSRAM(EMMC_BANK1_NORSRAM_T bank)
  49. {
  50. /** EMMC_BANK1_NORSRAM_1 */
  51. if (bank == EMMC_BANK1_NORSRAM_1)
  52. {
  53. EMMC_Bank1->SNCTRL_T[bank] = 0x000030DB;
  54. }
  55. /** EMMC_BANK1_NORSRAM_2, EMMC_BANK1_NORSRAM_3 or EMMC_BANK1_NORSRAM_4 */
  56. else
  57. {
  58. EMMC_Bank1->SNCTRL_T[bank] = 0x000030D2;
  59. }
  60. EMMC_Bank1->SNCTRL_T[bank + 1] = 0x0FFFFFFF;
  61. EMMC_Bank1E->WRTTIM[bank] = 0x0FFFFFFF;
  62. }
  63. /*!
  64. * @brief Rest the EMMMC NAND Banks registers
  65. *
  66. * @param bank: Selects the EMMMC Bank.
  67. * The parameter can be one of following values:
  68. * @arg EMMC_BANK2_NAND: FSMC Bank2 NAND
  69. * @arg EMMC_BANK3_NAND: FSMC Bank3 NAND
  70. *
  71. * @retval None
  72. */
  73. void EMMC_ResetNAND(EMMC_BANK_NAND_T bank)
  74. {
  75. if (bank == EMMC_BANK2_NAND)
  76. {
  77. /** Set the EMMC_Bank2 registers to their reset values */
  78. EMMC_Bank2->CTRL2 = 0x00000018;
  79. EMMC_Bank2->STSINT2 = 0x00000040;
  80. EMMC_Bank2->CMSTIM2 = 0xFCFCFCFC;
  81. EMMC_Bank2->AMSTIM2 = 0xFCFCFCFC;
  82. }
  83. /** EMMC_BANK3_NAND */
  84. else
  85. {
  86. /** Set the EMMC_Bank3 registers to their reset values */
  87. EMMC_Bank3->CTRL3 = 0x00000018;
  88. EMMC_Bank3->STSINT3 = 0x00000040;
  89. EMMC_Bank3->CMSTIM3 = 0xFCFCFCFC;
  90. EMMC_Bank3->AMSTIM3 = 0xFCFCFCFC;
  91. }
  92. }
  93. /*!
  94. * @brief Reset the EMMMC PCCARD Banks registers
  95. *
  96. * @param None
  97. *
  98. * @retval None
  99. */
  100. void EMMC_ResetPCCard(void)
  101. {
  102. /** Set the EMMC_Bank4 registers to their reset values */
  103. EMMC_Bank4->CTRL4 = 0x00000018;
  104. EMMC_Bank4->STSINT4 = 0x00000040;
  105. EMMC_Bank4->CMSTIM4 = 0xFCFCFCFC;
  106. EMMC_Bank4->AMSTIM4 = 0xFCFCFCFC;
  107. EMMC_Bank4->IOSTIM4 = 0xFCFCFCFC;
  108. }
  109. /*!
  110. * @brief Config the EMMC NOR/SRAM Banks according to the specified parameters in the emmcNORSRAMConfig.
  111. *
  112. * @param emmcNORSRAMConfig: Point to a EMMC_NORSRAMConfig_T structure
  113. *
  114. * @retval None
  115. */
  116. void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T *emmcNORSRAMConfig)
  117. {
  118. /** Bank1 NOR/SRAM control register configuration */
  119. EMMC_Bank1->SNCTRL_T[emmcNORSRAMConfig->bank] =
  120. (uint32_t)emmcNORSRAMConfig->dataAddressMux |
  121. emmcNORSRAMConfig->memoryType |
  122. emmcNORSRAMConfig->memoryDataWidth |
  123. emmcNORSRAMConfig->burstAcceesMode |
  124. emmcNORSRAMConfig->asynchronousWait |
  125. emmcNORSRAMConfig->waitSignalPolarity |
  126. emmcNORSRAMConfig->wrapMode |
  127. emmcNORSRAMConfig->waitSignalActive |
  128. emmcNORSRAMConfig->writeOperation |
  129. emmcNORSRAMConfig->waiteSignal |
  130. emmcNORSRAMConfig->extendedMode |
  131. emmcNORSRAMConfig->writeBurst;
  132. if (emmcNORSRAMConfig->memoryType == EMMC_MEMORY_TYPE_NOR)
  133. {
  134. EMMC_Bank1->SNCTRL_T[emmcNORSRAMConfig->bank] |= 0x00000040;
  135. }
  136. /** Bank1 NOR/SRAM timing register configuration */
  137. EMMC_Bank1->SNCTRL_T[emmcNORSRAMConfig->bank + 1] =
  138. (uint32_t)emmcNORSRAMConfig->readWriteTimingStruct->addressSetupTime |
  139. (emmcNORSRAMConfig->readWriteTimingStruct->addressHodeTime << 4) |
  140. (emmcNORSRAMConfig->readWriteTimingStruct->dataSetupTime << 8) |
  141. (emmcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime << 16) |
  142. (emmcNORSRAMConfig->readWriteTimingStruct->clockDivision << 20) |
  143. (emmcNORSRAMConfig->readWriteTimingStruct->dataLatency << 24) |
  144. emmcNORSRAMConfig->readWriteTimingStruct->accessMode;
  145. /** Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */
  146. if (emmcNORSRAMConfig->extendedMode == EMMC_EXTENDEN_MODE_ENABLE)
  147. {
  148. EMMC_Bank1E->WRTTIM[emmcNORSRAMConfig->bank] =
  149. (uint32_t)emmcNORSRAMConfig->writeTimingStruct->addressSetupTime |
  150. (emmcNORSRAMConfig->writeTimingStruct->addressHodeTime << 4) |
  151. (emmcNORSRAMConfig->writeTimingStruct->dataSetupTime << 8) |
  152. (emmcNORSRAMConfig->writeTimingStruct->clockDivision << 20) |
  153. (emmcNORSRAMConfig->writeTimingStruct->dataLatency << 24) |
  154. emmcNORSRAMConfig->writeTimingStruct->accessMode;
  155. }
  156. else
  157. {
  158. EMMC_Bank1E->WRTTIM[emmcNORSRAMConfig->bank] = 0x0FFFFFFF;
  159. }
  160. }
  161. /*!
  162. * @brief Config the EMMC NAND Banks according to the specified parameters in the emmcNANDConfig.
  163. *
  164. * @param emmcNANDConfig : Point to a EMMC_NANDConfig_T structure.
  165. *
  166. * @retval None
  167. */
  168. void EMMC_ConfigNAND(EMMC_NANDConfig_T *emmcNANDConfig)
  169. {
  170. uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000;
  171. /** Set the tmppcr value according to EMMC_NANDInitStruct parameters */
  172. tmppcr = (uint32_t)emmcNANDConfig->waitFeature | 0x00000008 |
  173. emmcNANDConfig->memoryDataWidth |
  174. emmcNANDConfig->ECC |
  175. emmcNANDConfig->ECCPageSize |
  176. (emmcNANDConfig->TCLRSetupTime << 9) |
  177. (emmcNANDConfig->TARSetupTime << 13);
  178. /** Set tmppmem value according to EMMC_CommonSpaceTimingStructure parameters */
  179. tmppmem = (uint32_t)emmcNANDConfig->commonSpaceTimingStruct->setupTime |
  180. (emmcNANDConfig->commonSpaceTimingStruct->waitSetupTime << 8) |
  181. (emmcNANDConfig->commonSpaceTimingStruct->holdSetupTime << 16) |
  182. (emmcNANDConfig->commonSpaceTimingStruct->HiZSetupTime << 24);
  183. /** Set tmppatt value according to EMMC_AttributeSpaceTimingStructure parameters */
  184. tmppatt = (uint32_t)emmcNANDConfig->attributeSpaceTimingStruct->setupTime |
  185. (emmcNANDConfig->attributeSpaceTimingStruct->waitSetupTime << 8) |
  186. (emmcNANDConfig->attributeSpaceTimingStruct->holdSetupTime << 16) |
  187. (emmcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime << 24);
  188. if (emmcNANDConfig->bank == EMMC_BANK2_NAND)
  189. {
  190. /** EMMC_BANK2_NAND registers configuration */
  191. EMMC_Bank2->CTRL2 = tmppcr;
  192. EMMC_Bank2->CMSTIM2 = tmppmem;
  193. EMMC_Bank2->AMSTIM2 = tmppatt;
  194. }
  195. else
  196. {
  197. /** EMMC_BANK3_NAND registers configuration */
  198. EMMC_Bank3->CTRL3 = tmppcr;
  199. EMMC_Bank3->CMSTIM3 = tmppmem;
  200. EMMC_Bank3->AMSTIM3 = tmppatt;
  201. }
  202. }
  203. /*!
  204. * @brief Config the EMMC PCCARD according to the specified parameters in the emmcPCCardConfig.
  205. *
  206. * @param emmcPCCardConfig: Point to a EMMC_PCCARDConfig_T structure.
  207. *
  208. * @retval None
  209. */
  210. void EMMC_ConfigPCCard(EMMC_PCCARDConfig_T *emmcPCCardConfig)
  211. {
  212. /** Set the PCR4 register value according to EMMC_PCCARDInitStruct parameters */
  213. EMMC_Bank4->CTRL4 = (uint32_t)emmcPCCardConfig->waitFeature | EMMC_MEMORY_DATA_WIDTH_16BIT |
  214. (emmcPCCardConfig->TCLRSetupTime << 9) |
  215. (emmcPCCardConfig->TARSetupTime << 13);
  216. /** Set PMEM4 register value according to EMMC_CommonSpaceTimingStructure parameters */
  217. EMMC_Bank4->CMSTIM4 = (uint32_t)emmcPCCardConfig->commonSpaceTimingStruct->setupTime |
  218. (emmcPCCardConfig->commonSpaceTimingStruct->waitSetupTime << 8) |
  219. (emmcPCCardConfig->commonSpaceTimingStruct->holdSetupTime << 16) |
  220. (emmcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime << 24);
  221. /** Set PATT4 register value according to EMMC_AttributeSpaceTimingStructure parameters */
  222. EMMC_Bank4->AMSTIM4 = (uint32_t)emmcPCCardConfig->attributeSpaceTimingStruct->setupTime |
  223. (emmcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime << 8) |
  224. (emmcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime << 16) |
  225. (emmcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime << 24);
  226. /** Set PIO4 register value according to EMMC_IOSpaceTimingStructure parameters */
  227. EMMC_Bank4->IOSTIM4 = (uint32_t)emmcPCCardConfig->IOSpaceTimingStruct->setupTime |
  228. (emmcPCCardConfig->IOSpaceTimingStruct->waitSetupTime << 8) |
  229. (emmcPCCardConfig->IOSpaceTimingStruct->holdSetupTime << 16) |
  230. (emmcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime << 24);
  231. }
  232. /*!
  233. * @brief Fills each emmcNORSRAMConfig member with its default value.
  234. *
  235. * @param emmcNORSRAMConfig : Point to a EMMC_NORSRAMConfig_T structure.
  236. *
  237. * @retval None
  238. */
  239. void EMMC_ConfigNORSRAMStructInit(EMMC_NORSRAMConfig_T *emmcNORSRAMConfig)
  240. {
  241. /** Reset NOR/SRAM Init structure parameters values */
  242. emmcNORSRAMConfig->bank = EMMC_BANK1_NORSRAM_1;
  243. emmcNORSRAMConfig->dataAddressMux = EMMC_DATA_ADDRESS_MUX_ENABLE;
  244. emmcNORSRAMConfig->memoryType = EMMC_MEMORY_TYPE_SRAM;
  245. emmcNORSRAMConfig->memoryDataWidth = EMMC_MEMORY_DATA_WIDTH_8BIT;
  246. emmcNORSRAMConfig->burstAcceesMode = EMMC_BURST_ACCESS_MODE_DISABLE;
  247. emmcNORSRAMConfig->asynchronousWait = EMMC_ASYNCHRONOUS_WAIT_DISABLE;
  248. emmcNORSRAMConfig->waitSignalPolarity = EMMC_WAIT_SIGNAL_POLARITY_LOW;
  249. emmcNORSRAMConfig->wrapMode = EMMC_WRAP_MODE_DISABLE;
  250. emmcNORSRAMConfig->waitSignalActive = EMMC_WAIT_SIGNAL_ACTIVE_BEFORE_WAIT;
  251. emmcNORSRAMConfig->writeOperation = EMMC_WRITE_OPERATION_ENABLE;
  252. emmcNORSRAMConfig->waiteSignal = EMMC_WAITE_SIGNAL_ENABLE;
  253. emmcNORSRAMConfig->extendedMode = EMMC_EXTENDEN_MODE_DISABLE;
  254. emmcNORSRAMConfig->writeBurst = EMMC_WRITE_BURST_DISABLE;
  255. emmcNORSRAMConfig->readWriteTimingStruct->addressSetupTime = 0xF;
  256. emmcNORSRAMConfig->readWriteTimingStruct->addressHodeTime = 0xF;
  257. emmcNORSRAMConfig->readWriteTimingStruct->dataSetupTime = 0xFF;
  258. emmcNORSRAMConfig->readWriteTimingStruct->busTurnaroundTime = 0xF;
  259. emmcNORSRAMConfig->readWriteTimingStruct->clockDivision = 0xF;
  260. emmcNORSRAMConfig->readWriteTimingStruct->dataLatency = 0xF;
  261. emmcNORSRAMConfig->readWriteTimingStruct->accessMode = EMMC_ACCESS_MODE_A;
  262. emmcNORSRAMConfig->writeTimingStruct->addressSetupTime = 0xF;
  263. emmcNORSRAMConfig->writeTimingStruct->addressHodeTime = 0xF;
  264. emmcNORSRAMConfig->writeTimingStruct->dataSetupTime = 0xFF;
  265. emmcNORSRAMConfig->writeTimingStruct->busTurnaroundTime = 0xF;
  266. emmcNORSRAMConfig->writeTimingStruct->clockDivision = 0xF;
  267. emmcNORSRAMConfig->writeTimingStruct->dataLatency = 0xF;
  268. emmcNORSRAMConfig->writeTimingStruct->accessMode = EMMC_ACCESS_MODE_A;
  269. }
  270. /*!
  271. * @brief Fills each emmcNANDConfig member with its default value.
  272. *
  273. * @param emmcNANDConfig : Point to a EMMC_NANDConfig_T structure.
  274. *
  275. * @retval None
  276. */
  277. void EMMC_ConfigNANDStructInit(EMMC_NANDConfig_T *emmcNANDConfig)
  278. {
  279. /** Reset NAND Init structure parameters values */
  280. emmcNANDConfig->bank = EMMC_BANK2_NAND;
  281. emmcNANDConfig->waitFeature = EMMC_WAIT_FEATURE_DISABLE;
  282. emmcNANDConfig->memoryDataWidth = EMMC_MEMORY_DATA_WIDTH_8BIT;
  283. emmcNANDConfig->ECC = EMMC_ECC_DISABLE;
  284. emmcNANDConfig->ECCPageSize = EMMC_ECC_PAGE_SIZE_BYTE_256;
  285. emmcNANDConfig->TCLRSetupTime = 0x0;
  286. emmcNANDConfig->TARSetupTime = 0x0;
  287. emmcNANDConfig->commonSpaceTimingStruct->setupTime = 0xFC;
  288. emmcNANDConfig->commonSpaceTimingStruct->waitSetupTime = 0xFC;
  289. emmcNANDConfig->commonSpaceTimingStruct->holdSetupTime = 0xFC;
  290. emmcNANDConfig->commonSpaceTimingStruct->HiZSetupTime = 0xFC;
  291. emmcNANDConfig->attributeSpaceTimingStruct->setupTime = 0xFC;
  292. emmcNANDConfig->attributeSpaceTimingStruct->waitSetupTime = 0xFC;
  293. emmcNANDConfig->attributeSpaceTimingStruct->holdSetupTime = 0xFC;
  294. emmcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime = 0xFC;
  295. }
  296. /*!
  297. * @brief Fills each emmcPCCardConfig member with its default value.
  298. *
  299. * @param emmcPCCardConfig : Point to a EMMC_PCCARDConfig_T structure.
  300. *
  301. * @retval None
  302. */
  303. void EMMC_ConfigPCCardStructInit(EMMC_PCCARDConfig_T *emmcPCCardConfig)
  304. {
  305. /** Reset PCCARD Init structure parameters values */
  306. emmcPCCardConfig->waitFeature = EMMC_WAIT_FEATURE_DISABLE;
  307. emmcPCCardConfig->TCLRSetupTime = 0x0;
  308. emmcPCCardConfig->TARSetupTime = 0x0;
  309. emmcPCCardConfig->commonSpaceTimingStruct->setupTime = 0xFC;
  310. emmcPCCardConfig->commonSpaceTimingStruct->waitSetupTime = 0xFC;
  311. emmcPCCardConfig->commonSpaceTimingStruct->holdSetupTime = 0xFC;
  312. emmcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime = 0xFC;
  313. emmcPCCardConfig->attributeSpaceTimingStruct->setupTime = 0xFC;
  314. emmcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime = 0xFC;
  315. emmcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime = 0xFC;
  316. emmcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime = 0xFC;
  317. emmcPCCardConfig->IOSpaceTimingStruct->setupTime = 0xFC;
  318. emmcPCCardConfig->IOSpaceTimingStruct->waitSetupTime = 0xFC;
  319. emmcPCCardConfig->IOSpaceTimingStruct->holdSetupTime = 0xFC;
  320. emmcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime = 0xFC;
  321. }
  322. /*!
  323. * @brief Enables the specified NOR/SRAM Memory Bank.
  324. *
  325. * @param bank: Selects the EMMMC Bank.
  326. * The parameter can be one of following values:
  327. * @arg EMMC_BANK1_NORSRAM_1: EMMC Bank1 NOR/SRAM1
  328. * @arg EMMC_BANK1_NORSRAM_2: EMMC Bank1 NOR/SRAM2
  329. * @arg EMMC_BANK1_NORSRAM_3: EMMC Bank1 NOR/SRAM3
  330. * @arg EMMC_BANK1_NORSRAM_4: EMMC Bank1 NOR/SRAM4
  331. *
  332. * @retval None
  333. */
  334. void EMMC_EnableNORSRAM(EMMC_BANK1_NORSRAM_T bank)
  335. {
  336. EMMC_Bank1->SNCTRL_T[bank] |= 0x00000001;
  337. }
  338. /*!
  339. * @brief Disbles the specified NOR/SRAM Memory Bank.
  340. *
  341. * @param bank: Selects the EMMMC Bank.
  342. * The parameter can be one of following values:
  343. * @arg EMMC_BANK1_NORSRAM_1: EMMC Bank1 NOR/SRAM1
  344. * @arg EMMC_BANK1_NORSRAM_2: EMMC Bank1 NOR/SRAM2
  345. * @arg EMMC_BANK1_NORSRAM_3: EMMC Bank1 NOR/SRAM3
  346. * @arg EMMC_BANK1_NORSRAM_4: EMMC Bank1 NOR/SRAM4
  347. *
  348. * @retval None
  349. */
  350. void EMMC_DisableNORSRAM(EMMC_BANK1_NORSRAM_T bank)
  351. {
  352. EMMC_Bank1->SNCTRL_T[bank] &= 0x000FFFFE;
  353. }
  354. /*!
  355. * @brief Enables the specified NAND Memory Bank.
  356. *
  357. * @param bank: Selects the EMMMC Bank.
  358. * The parameter can be one of following values:
  359. * @arg EMMC_BANK2_NAND: FSMC Bank2 NAND
  360. * @arg EMMC_BANK3_NAND: FSMC Bank3 NAND
  361. *
  362. * @retval None
  363. */
  364. void EMMC_EnableNAND(EMMC_BANK_NAND_T bank)
  365. {
  366. if (bank == EMMC_BANK2_NAND)
  367. {
  368. EMMC_Bank2->CTRL2_B.MBKEN = BIT_SET;
  369. }
  370. else
  371. {
  372. EMMC_Bank3->CTRL3_B.MBKEN = BIT_SET;
  373. }
  374. }
  375. /*!
  376. * @brief Disbles the specified NAND Memory Bank.
  377. *
  378. * @param bank: Selects the EMMMC Bank.
  379. * The parameter can be one of following values:
  380. * @arg EMMC_BANK2_NAND: FSMC Bank2 NAND
  381. * @arg EMMC_BANK3_NAND: FSMC Bank3 NAND
  382. *
  383. * @retval None
  384. */
  385. void EMMC_DisableNAND(EMMC_BANK_NAND_T bank)
  386. {
  387. if (bank == EMMC_BANK2_NAND)
  388. {
  389. EMMC_Bank2->CTRL2_B.MBKEN = BIT_RESET;
  390. }
  391. else
  392. {
  393. EMMC_Bank3->CTRL3_B.MBKEN = BIT_RESET;
  394. }
  395. }
  396. /*!
  397. * @brief Enables the specified PC Card Memory Bank.
  398. *
  399. * @param None
  400. *
  401. * @retval None
  402. */
  403. void EMMC_EnablePCCARD(void)
  404. {
  405. EMMC_Bank4->CTRL4_B.MBKEN = BIT_SET;
  406. }
  407. /*!
  408. * @brief Disables the specified PC Card Memory Bank.
  409. *
  410. * @param None
  411. *
  412. * @retval None
  413. */
  414. void EMMC_DisablePCCARD(void)
  415. {
  416. EMMC_Bank4->CTRL4_B.MBKEN = BIT_RESET;
  417. }
  418. /*!
  419. * @brief Enbles the EMMC NAND ECC feature.
  420. *
  421. * @param bank: Selects the EMMMC Bank.
  422. * The parameter can be one of following values:
  423. * @arg EMMC_BANK2_NAND: FSMC Bank2 NAND
  424. * @arg EMMC_BANK3_NAND: FSMC Bank3 NAND
  425. *
  426. * @retval None
  427. */
  428. void EMMC_EnableNANDECC(EMMC_BANK_NAND_T bank)
  429. {
  430. if (bank == EMMC_BANK2_NAND)
  431. {
  432. EMMC_Bank2->CTRL2 |= 0x00000040;
  433. }
  434. else
  435. {
  436. EMMC_Bank3->CTRL3 |= 0x00000040;
  437. }
  438. }
  439. /*!
  440. * @brief Disbles or disables the EMMC NAND ECC feature.
  441. *
  442. * @param bank: Selects the EMMMC Bank.
  443. * The parameter can be one of following values:
  444. * @arg EMMC_BANK2_NAND: FSMC Bank2 NAND
  445. * @arg EMMC_BANK3_NAND: FSMC Bank3 NAND
  446. *
  447. * @retval None
  448. *
  449. */
  450. void EMMC_DisableNANDECC(EMMC_BANK_NAND_T bank)
  451. {
  452. if (bank == EMMC_BANK2_NAND)
  453. {
  454. EMMC_Bank2->CTRL2 &= 0x000FFFBF;
  455. }
  456. else
  457. {
  458. EMMC_Bank3->CTRL3 &= 0x000FFFBF;
  459. }
  460. }
  461. /*!
  462. * @brief Read the error correction code register value.
  463. *
  464. * @param bank: Selects the EMMMC Bank.
  465. * The parameter can be one of following values:
  466. * @arg EMMC_BANK2_NAND: FSMC Bank2 NAND
  467. * @arg EMMC_BANK3_NAND: FSMC Bank3 NAND
  468. *
  469. * @retval The value of Error Correction Code (ECC).
  470. */
  471. uint32_t EMMC_ReadECC(EMMC_BANK_NAND_T bank)
  472. {
  473. uint32_t eccval = 0x00000000;
  474. if (bank == EMMC_BANK2_NAND)
  475. {
  476. eccval = EMMC_Bank2->ECCRS2;
  477. }
  478. else
  479. {
  480. eccval = EMMC_Bank3->ECCRS3;
  481. }
  482. return eccval;
  483. }
  484. /*!
  485. * @brief Enables the specified EMMC interrupts.
  486. *
  487. * @param bank: Selects the EMMMC Bank.
  488. * The parameter can be one of following values:
  489. * @arg EMMC_BANK2_NAND : FSMC Bank2 NAND
  490. * @arg EMMC_BANK3_NAND : FSMC Bank3 NAND
  491. * @arg EMMC_BANK4_PCCARD: FSMC Bank4 PCCARD
  492. *
  493. * @param interrupt: Select the EMMC interrupt sources.
  494. * This parameter can be any combination of the following values:
  495. * @arg EMMC_INT_EDGE_RISING : Rising edge detection interrupt.
  496. * @arg EMMC_INT_LEVEL_HIGH : High level detection interrupt.
  497. * @arg EMMC_INT_EDGE_FALLING: Falling edge detection interrupt.
  498. *
  499. * @retval None
  500. */
  501. void EMMC_EnableInterrupt(EMMC_BANK_NAND_T bank, uint32_t interrupt)
  502. {
  503. if (bank == EMMC_BANK2_NAND)
  504. {
  505. EMMC_Bank2->STSINT2 |= interrupt;
  506. }
  507. else if (bank == EMMC_BANK3_NAND)
  508. {
  509. EMMC_Bank3->STSINT3 |= interrupt;
  510. }
  511. else
  512. {
  513. EMMC_Bank4->STSINT4 |= interrupt;
  514. }
  515. }
  516. /*!
  517. * @brief Enables the specified EMMC interrupts.
  518. *
  519. * @param bank: Selects the EMMMC Bank.
  520. * The parameter can be one of following values:
  521. * @arg EMMC_BANK2_NAND : FSMC Bank2 NAND
  522. * @arg EMMC_BANK3_NAND : FSMC Bank3 NAND
  523. * @arg EMMC_BANK4_PCCARD: FSMC Bank4 PCCARD
  524. *
  525. * @param interrupt: Select the EMMC interrupt sources.
  526. * This parameter can be any combination of the following values:
  527. * @arg EMMC_INT_EDGE_RISING : Rising edge detection interrupt.
  528. * @arg EMMC_INT_LEVEL_HIGH : High level edge detection interrupt.
  529. * @arg EMMC_INT_EDGE_FALLING: Falling edge detection interrupt.
  530. *
  531. * @retval None
  532. */
  533. void EMMC_DisableInterrupt(EMMC_BANK_NAND_T bank, uint32_t interrupt)
  534. {
  535. if (bank == EMMC_BANK2_NAND)
  536. {
  537. EMMC_Bank2->STSINT2 &= ~interrupt;
  538. }
  539. else if (bank == EMMC_BANK3_NAND)
  540. {
  541. EMMC_Bank3->STSINT3 &= ~interrupt;
  542. }
  543. else
  544. {
  545. EMMC_Bank4->STSINT4 &= ~interrupt;
  546. }
  547. }
  548. /*!
  549. * @brief Read the status of specified EMMC flag.
  550. *
  551. * @param bank: Selects the EMMMC Bank.
  552. * The parameter can be one of following values:
  553. * @arg EMMC_BANK2_NAND : FSMC Bank2 NAND
  554. * @arg EMMC_BANK3_NAND : FSMC Bank3 NAND
  555. * @arg EMMC_BANK4_PCCARD: FSMC Bank4 PCCARD
  556. *
  557. * @param flag: Select the EMMC interrupt sources.
  558. * This parameter can be one of the following values:
  559. * @arg EMMC_FLAG_EDGE_RISING : Rising egde detection Flag.
  560. * @arg EMMC_FLAG_LEVEL_HIGH : High level detection Flag.
  561. * @arg EMMC_FLAG_EDGE_FALLING: Falling egde detection Flag.
  562. * @arg EMMC_FLAG_FIFO_EMPTY : FIFO empty Flag.
  563. *
  564. * @retval SET or RESET
  565. *
  566. */
  567. uint8_t EMMC_ReadStatusFlag(EMMC_BANK_NAND_T bank, EMMC_FLAG_T flag)
  568. {
  569. uint32_t tmpsr = 0x00000000;
  570. if (bank == EMMC_BANK2_NAND)
  571. {
  572. tmpsr = EMMC_Bank2->STSINT2;
  573. }
  574. else if (bank == EMMC_BANK3_NAND)
  575. {
  576. tmpsr = EMMC_Bank3->STSINT3;
  577. }
  578. else
  579. {
  580. tmpsr = EMMC_Bank4->STSINT4;
  581. }
  582. /** Get the flag status */
  583. if ((tmpsr & flag) != RESET)
  584. {
  585. return SET;
  586. }
  587. else
  588. {
  589. return RESET;
  590. }
  591. }
  592. /*!
  593. * @brief Clears the EMMC's pending flags.
  594. *
  595. * @param bank: Selects the EMMMC Bank.
  596. * The parameter can be one of following values:
  597. * @arg EMMC_BANK2_NAND : FSMC Bank2 NAND
  598. * @arg EMMC_BANK3_NAND : FSMC Bank3 NAND
  599. * @arg EMMC_BANK4_PCCARD: FSMC Bank4 PCCARD
  600. *
  601. * @param flag: Select the EMMC interrupt sources.
  602. * This parameter can be any combination of the following values:
  603. * @arg EMMC_FLAG_EDGE_RISING : Rising egde detection Flag.
  604. * @arg EMMC_FLAG_LEVEL_HIGH : High level detection Flag.
  605. * @arg EMMC_FLAG_EDGE_FALLING: Falling egde detection Flag.
  606. *
  607. * @retval None
  608. */
  609. void EMMC_ClearStatusFlag(EMMC_BANK_NAND_T bank, uint32_t flag)
  610. {
  611. if (bank == EMMC_BANK2_NAND)
  612. {
  613. EMMC_Bank2->STSINT2 &= ~flag;
  614. }
  615. else if (bank == EMMC_BANK3_NAND)
  616. {
  617. EMMC_Bank3->STSINT3 &= ~flag;
  618. }
  619. else
  620. {
  621. EMMC_Bank4->STSINT4 &= ~flag;
  622. }
  623. }
  624. /*!
  625. * @brief Read the specified EMMC interrupt has occurred or not.
  626. *
  627. * @param bank: Selects the EMMMC Bank.
  628. * The parameter can be one of following values:
  629. * @arg EMMC_BANK2_NAND : FSMC Bank2 NAND
  630. * @arg EMMC_BANK3_NAND : FSMC Bank3 NAND
  631. * @arg EMMC_BANK4_PCCARD: FSMC Bank4 PCCARD
  632. *
  633. * @param interrupt: Select the EMMC interrupt source.
  634. * This parameter can be one of the following values:
  635. * @arg EMMC_INT_EDGE_RISING : Rising edge detection interrupt.
  636. * @arg EMMC_INT_LEVEL_HIGH : High level edge detection interrupt.
  637. * @arg EMMC_INT_EDGE_FALLING: Falling edge detection interrupt.
  638. *
  639. * @retval The status of specified EMMC interrupt source.
  640. */
  641. uint8_t EMMC_ReadIntFlag(EMMC_BANK_NAND_T bank, EMMC_INT_T flag)
  642. {
  643. uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0;
  644. if (bank == EMMC_BANK2_NAND)
  645. {
  646. tmpsr = EMMC_Bank2->STSINT2;
  647. }
  648. else if (bank == EMMC_BANK3_NAND)
  649. {
  650. tmpsr = EMMC_Bank3->STSINT3;
  651. }
  652. else
  653. {
  654. tmpsr = EMMC_Bank4->STSINT4;
  655. }
  656. itstatus = tmpsr & flag;
  657. itenable = tmpsr & (flag >> 3);
  658. if ((itstatus != RESET) && (itenable != RESET))
  659. {
  660. return SET;
  661. }
  662. else
  663. {
  664. return RESET;
  665. }
  666. }
  667. /*!
  668. * @brief Clears the EMMC's interrupt Flag.
  669. *
  670. * @param bank: Selects the EMMMC Bank.
  671. * The parameter can be one of following values:
  672. * @arg EMMC_BANK2_NAND : FSMC Bank2 NAND
  673. * @arg EMMC_BANK3_NAND : FSMC Bank3 NAND
  674. * @arg EMMC_BANK4_PCCARD: FSMC Bank4 PCCARD
  675. *
  676. * @param interrupt: Select the EMMC interrupt sources.
  677. * This parameter can be any combination of the following values:
  678. * @arg EMMC_INT_EDGE_RISING : Rising edge detection interrupt.
  679. * @arg EMMC_INT_LEVEL_HIGH : High level edge detection interrupt.
  680. * @arg EMMC_INT_EDGE_FALLING: Falling edge detection interrupt.
  681. *
  682. * @retval None
  683. */
  684. void EMMC_ClearIntFlag(EMMC_BANK_NAND_T bank, uint32_t flag)
  685. {
  686. if (bank == EMMC_BANK2_NAND)
  687. {
  688. EMMC_Bank2->STSINT2 &= ~(flag >> 3);
  689. }
  690. else if (bank == EMMC_BANK3_NAND)
  691. {
  692. EMMC_Bank3->STSINT3 &= ~(flag >> 3);
  693. }
  694. else
  695. {
  696. EMMC_Bank4->STSINT4 &= ~(flag >> 3);
  697. }
  698. }
  699. /**@} end of group EMMC_Fuctions*/
  700. /**@} end of group EMMC_Driver*/
  701. /**@} end of group Peripherals_Library*/