Skip to content

Commit 588bf4f

Browse files
committed
drivers: usdhc: change the driver to be aarch64 compatible
Make the driver to work on Cortex-A Core. Signed-off-by: Jiafei Pan <[email protected]>
1 parent 7dd3fe4 commit 588bf4f

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

mcux/mcux-sdk/drivers/usdhc/fsl_usdhc.c

+25-21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright (c) 2016, Freescale Semiconductor, Inc.
3-
* Copyright 2016-2021 NXP
3+
* Copyright 2016-2021, 2025 NXP
44
* All rights reserved.
55
*
66
* SPDX-License-Identifier: BSD-3-Clause
@@ -1222,11 +1222,11 @@ status_t USDHC_SetADMA1Descriptor(
12221222

12231223
uint32_t miniEntries, startEntries = 0UL,
12241224
maxEntries = (admaTableWords * sizeof(uint32_t)) / sizeof(usdhc_adma1_descriptor_t);
1225-
usdhc_adma1_descriptor_t *adma1EntryAddress = (usdhc_adma1_descriptor_t *)(uint32_t)(admaTable);
1225+
usdhc_adma1_descriptor_t *adma1EntryAddress = (usdhc_adma1_descriptor_t *)(uintptr_t)(admaTable);
12261226
uint32_t i, dmaBufferLen = 0UL;
12271227
const uint32_t *data = dataBufferAddr;
12281228

1229-
if (((uint32_t)data % USDHC_ADMA1_ADDRESS_ALIGN) != 0UL)
1229+
if (((uintptr_t)data % USDHC_ADMA1_ADDRESS_ALIGN) != 0UL)
12301230
{
12311231
return kStatus_USDHC_DMADataAddrNotAlign;
12321232
}
@@ -1277,10 +1277,10 @@ status_t USDHC_SetADMA1Descriptor(
12771277

12781278
adma1EntryAddress[i] = (dmaBufferLen << USDHC_ADMA1_DESCRIPTOR_LENGTH_SHIFT);
12791279
adma1EntryAddress[i] |= (uint32_t)kUSDHC_Adma1DescriptorTypeSetLength;
1280-
adma1EntryAddress[i + 1UL] = (uint32_t)(data);
1280+
adma1EntryAddress[i + 1UL] = (uintptr_t)(data);
12811281
adma1EntryAddress[i + 1UL] |=
12821282
(uint32_t)kUSDHC_Adma1DescriptorTypeTransfer | (uint32_t)kUSDHC_Adma1DescriptorInterrupFlag;
1283-
data = (uint32_t *)((uint32_t)data + dmaBufferLen);
1283+
data = (uint32_t *)((uintptr_t)data + dmaBufferLen);
12841284
dataBytes -= dmaBufferLen;
12851285
}
12861286
/* the end of the descriptor */
@@ -1309,11 +1309,11 @@ status_t USDHC_SetADMA2Descriptor(
13091309

13101310
uint32_t miniEntries, startEntries = 0UL,
13111311
maxEntries = (admaTableWords * sizeof(uint32_t)) / sizeof(usdhc_adma2_descriptor_t);
1312-
usdhc_adma2_descriptor_t *adma2EntryAddress = (usdhc_adma2_descriptor_t *)(uint32_t)(admaTable);
1312+
usdhc_adma2_descriptor_t *adma2EntryAddress = (usdhc_adma2_descriptor_t *)(uintptr_t)(admaTable);
13131313
uint32_t i, dmaBufferLen = 0UL;
13141314
const uint32_t *data = dataBufferAddr;
13151315

1316-
if (((uint32_t)data % USDHC_ADMA2_ADDRESS_ALIGN) != 0UL)
1316+
if (((uintptr_t)data % USDHC_ADMA2_ADDRESS_ALIGN) != 0UL)
13171317
{
13181318
return kStatus_USDHC_DMADataAddrNotAlign;
13191319
}
@@ -1371,13 +1371,17 @@ status_t USDHC_SetADMA2Descriptor(
13711371
}
13721372

13731373
/* Each descriptor for ADMA2 is 64-bit in length */
1374+
#if INTPTR_MAX == INT64_MAX
1375+
adma2EntryAddress[i].address = (uintptr_t)((dataBytes == 0UL) ? &s_usdhcBootDummy : data);
1376+
#else
13741377
adma2EntryAddress[i].address = (dataBytes == 0UL) ? &s_usdhcBootDummy : data;
1378+
#endif
13751379
adma2EntryAddress[i].attribute = (dmaBufferLen << USDHC_ADMA2_DESCRIPTOR_LENGTH_SHIFT);
13761380
adma2EntryAddress[i].attribute |=
13771381
(dataBytes == 0UL) ?
13781382
0UL :
13791383
((uint32_t)kUSDHC_Adma2DescriptorTypeTransfer | (uint32_t)kUSDHC_Adma2DescriptorInterruptFlag);
1380-
data = (uint32_t *)((uint32_t)data + dmaBufferLen);
1384+
data = (uint32_t *)((uintptr_t)data + dmaBufferLen);
13811385

13821386
if (dataBytes != 0UL)
13831387
{
@@ -1420,7 +1424,7 @@ status_t USDHC_SetInternalDmaConfig(USDHC_Type *base,
14201424
assert(dmaConfig != NULL);
14211425
assert(dataAddr != NULL);
14221426
assert((NULL != dmaConfig->admaTable) &&
1423-
(((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uint32_t)dmaConfig->admaTable) == 0UL));
1427+
(((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uintptr_t)dmaConfig->admaTable) == 0UL));
14241428

14251429
#if FSL_FEATURE_USDHC_HAS_EXT_DMA
14261430
/* disable the external DMA if support */
@@ -1430,26 +1434,26 @@ status_t USDHC_SetInternalDmaConfig(USDHC_Type *base,
14301434
if (dmaConfig->dmaMode == kUSDHC_DmaModeSimple)
14311435
{
14321436
/* check DMA data buffer address align or not */
1433-
if (((uint32_t)dataAddr % USDHC_ADMA2_ADDRESS_ALIGN) != 0UL)
1437+
if (((uintptr_t)dataAddr % USDHC_ADMA2_ADDRESS_ALIGN) != 0UL)
14341438
{
14351439
return kStatus_USDHC_DMADataAddrNotAlign;
14361440
}
14371441
/* in simple DMA mode if use auto CMD23, address should load to ADMA addr,
14381442
and block count should load to DS_ADDR*/
14391443
if (enAutoCmd23)
14401444
{
1441-
base->ADMA_SYS_ADDR = USDHC_ADDR_CPU_2_DMA((uint32_t)dataAddr);
1445+
base->ADMA_SYS_ADDR = USDHC_ADDR_CPU_2_DMA((uintptr_t)dataAddr);
14421446
}
14431447
else
14441448
{
1445-
base->DS_ADDR = USDHC_ADDR_CPU_2_DMA((uint32_t)dataAddr);
1449+
base->DS_ADDR = USDHC_ADDR_CPU_2_DMA((uintptr_t)dataAddr);
14461450
}
14471451
}
14481452
else
14491453
{
14501454
/* When use ADMA, disable simple DMA */
14511455
base->DS_ADDR = 0UL;
1452-
base->ADMA_SYS_ADDR = USDHC_ADDR_CPU_2_DMA((uint32_t)(dmaConfig->admaTable));
1456+
base->ADMA_SYS_ADDR = USDHC_ADDR_CPU_2_DMA((uintptr_t)(dmaConfig->admaTable));
14531457
}
14541458

14551459
#if (defined(FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN) && FSL_FEATURE_USDHC_HAS_NO_RW_BURST_LEN)
@@ -1485,14 +1489,14 @@ status_t USDHC_SetAdmaTableConfig(USDHC_Type *base,
14851489
{
14861490
assert(NULL != dmaConfig);
14871491
assert((NULL != dmaConfig->admaTable) &&
1488-
(((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uint32_t)dmaConfig->admaTable) == 0UL));
1492+
(((USDHC_ADMA_TABLE_ADDRESS_ALIGN - 1U) & (uintptr_t)dmaConfig->admaTable) == 0UL));
14891493
assert(NULL != dataConfig);
14901494

14911495
status_t error = kStatus_Fail;
14921496
uint32_t bootDummyOffset =
14931497
dataConfig->dataType == (uint32_t)kUSDHC_TransferDataBootcontinous ? sizeof(uint32_t) : 0UL;
1494-
const uint32_t *data = (const uint32_t *)USDHC_ADDR_CPU_2_DMA((uint32_t)(
1495-
(uint32_t)((dataConfig->rxData == NULL) ? dataConfig->txData : dataConfig->rxData) + bootDummyOffset));
1498+
const uint32_t *data = (const uint32_t *)USDHC_ADDR_CPU_2_DMA((uintptr_t)(
1499+
(uintptr_t)((dataConfig->rxData == NULL) ? dataConfig->txData : dataConfig->rxData) + bootDummyOffset));
14961500
uint32_t blockSize = dataConfig->blockSize * dataConfig->blockCount - bootDummyOffset;
14971501

14981502
#if FSL_FEATURE_USDHC_HAS_EXT_DMA
@@ -1605,12 +1609,12 @@ status_t USDHC_TransferBlocking(USDHC_Type *base, usdhc_adma_config_t *dmaConfig
16051609
if (data->txData != NULL)
16061610
{
16071611
/* clear the DCACHE */
1608-
DCACHE_CleanByRange((uint32_t)data->txData, (data->blockSize) * (data->blockCount));
1612+
DCACHE_CleanByRange((uintptr_t)data->txData, (data->blockSize) * (data->blockCount));
16091613
}
16101614
else
16111615
{
16121616
/* clear the DCACHE */
1613-
DCACHE_CleanInvalidateByRange((uint32_t)data->rxData, (data->blockSize) * (data->blockCount));
1617+
DCACHE_CleanInvalidateByRange((uintptr_t)data->rxData, (data->blockSize) * (data->blockCount));
16141618
}
16151619
}
16161620
#endif
@@ -1926,12 +1930,12 @@ status_t USDHC_TransferNonBlocking(USDHC_Type *base,
19261930
if (data->txData != NULL)
19271931
{
19281932
/* clear the DCACHE */
1929-
DCACHE_CleanByRange((uint32_t)data->txData, (data->blockSize) * (data->blockCount));
1933+
DCACHE_CleanByRange((uintptr_t)data->txData, (data->blockSize) * (data->blockCount));
19301934
}
19311935
else
19321936
{
19331937
/* clear the DCACHE */
1934-
DCACHE_CleanInvalidateByRange((uint32_t)data->rxData, (data->blockSize) * (data->blockCount));
1938+
DCACHE_CleanInvalidateByRange((uintptr_t)data->rxData, (data->blockSize) * (data->blockCount));
19351939
}
19361940
}
19371941
#endif
@@ -2345,7 +2349,7 @@ static void USDHC_TransferHandleData(USDHC_Type *base, usdhc_handle_t *handle, u
23452349
#if defined(FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL) && FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL
23462350
if (handle->data->rxData != NULL)
23472351
{
2348-
DCACHE_InvalidateByRange((uint32_t)(handle->data->rxData),
2352+
DCACHE_InvalidateByRange((uintptr_t)(handle->data->rxData),
23492353
(handle->data->blockSize) * (handle->data->blockCount));
23502354
}
23512355
#endif

mcux/mcux-sdk/drivers/usdhc/fsl_usdhc.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright (c) 2016, Freescale Semiconductor, Inc.
3-
* Copyright 2016-2021 NXP
3+
* Copyright 2016-2021, 2025 NXP
44
* All rights reserved.
55
*
66
* SPDX-License-Identifier: BSD-3-Clause
@@ -21,8 +21,8 @@
2121

2222
/*! @name Driver version */
2323
/*@{*/
24-
/*! @brief Driver version 2.8.4. */
25-
#define FSL_USDHC_DRIVER_VERSION (MAKE_VERSION(2U, 8U, 4U))
24+
/*! @brief Driver version 2.8.5. */
25+
#define FSL_USDHC_DRIVER_VERSION (MAKE_VERSION(2U, 8U, 5U))
2626
/*@}*/
2727

2828
/*! @brief Maximum block count can be set one time */
@@ -587,7 +587,11 @@ typedef uint32_t usdhc_adma1_descriptor_t;
587587
typedef struct _usdhc_adma2_descriptor
588588
{
589589
uint32_t attribute; /*!< The control and status field. */
590+
#if INTPTR_MAX == INT64_MAX
591+
uint32_t address; /*!< The address field. */
592+
#else
590593
const uint32_t *address; /*!< The address field. */
594+
#endif
591595
} usdhc_adma2_descriptor_t;
592596

593597
/*!

0 commit comments

Comments
 (0)