/*************************************************************************** * Copyright (c) 2024 Microsoft Corporation * Copyright (c) 2026-present Eclipse ThreadX contributors * * This program and the accompanying materials are made available under the * terms of the MIT License which is available at * https://opensource.org/licenses/MIT. * * SPDX-License-Identifier: MIT **************************************************************************/ /**************************************************************************/ /**************************************************************************/ /** */ /** LevelX Component */ /** */ /** NOR Flash */ /** */ /**************************************************************************/ /**************************************************************************/ #define LX_SOURCE_CODE /* Disable ThreadX error checking. */ #ifndef LX_DISABLE_ERROR_CHECKING #define LX_DISABLE_ERROR_CHECKING #endif /* Include necessary system files. */ #include "lx_api.h" /**************************************************************************/ /* */ /* FUNCTION RELEASE */ /* */ /* _lx_nor_flash_close PORTABLE C */ /* 6.1.7 */ /* AUTHOR */ /* */ /* William E. Lamie, Microsoft Corporation */ /* */ /* DESCRIPTION */ /* */ /* This function closes a NOR flash instance. */ /* */ /* INPUT */ /* */ /* nor_flash NOR flash instance */ /* */ /* OUTPUT */ /* */ /* return status */ /* */ /* CALLS */ /* */ /* tx_mutex_delete Delete thread-safe mutex */ /* */ /* CALLED BY */ /* */ /* Application Code */ /* */ /**************************************************************************/ UINT _lx_nor_flash_close(LX_NOR_FLASH *nor_flash) { LX_INTERRUPT_SAVE_AREA /* Lockout interrupts for NOR flash close. */ LX_DISABLE /* See if the media is the only one on the media opened list. */ if ((_lx_nor_flash_opened_ptr == nor_flash) && (_lx_nor_flash_opened_ptr == nor_flash -> lx_nor_flash_open_next) && (_lx_nor_flash_opened_ptr == nor_flash -> lx_nor_flash_open_previous)) { /* Only opened NOR flash, just set the opened list to NULL. */ _lx_nor_flash_opened_ptr = LX_NULL; } else { /* Otherwise, not the only opened NOR flash, link-up the neighbors. */ (nor_flash -> lx_nor_flash_open_next) -> lx_nor_flash_open_previous = nor_flash -> lx_nor_flash_open_previous; (nor_flash -> lx_nor_flash_open_previous) -> lx_nor_flash_open_next = nor_flash -> lx_nor_flash_open_next; /* See if we have to update the opened list head pointer. */ if (_lx_nor_flash_opened_ptr == nor_flash) { /* Yes, move the head pointer to the next opened NOR flash. */ _lx_nor_flash_opened_ptr = nor_flash -> lx_nor_flash_open_next; } } /* Decrement the opened NOR flash counter. */ _lx_nor_flash_opened_count--; /* Finally, indicate that this NOR flash is closed. */ nor_flash -> lx_nor_flash_state = LX_NOR_FLASH_CLOSED; /* Restore interrupt posture. */ LX_RESTORE #ifdef LX_THREAD_SAFE_ENABLE /* Delete the thread safe mutex. */ tx_mutex_delete(&nor_flash -> lx_nor_flash_mutex); #endif /* Return success. */ return(LX_SUCCESS); }