diff options
Diffstat (limited to 'firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY')
2 files changed, 940 insertions, 0 deletions
| diff --git a/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c b/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c new file mode 100644 index 0000000..09790c2 --- /dev/null +++ b/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c @@ -0,0 +1,571 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + *   - MEM <-> USB; + *   - MEM <-> RAM; + *   - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + *   - write-protected globals; + *   - password-protected data; + *   - specific features; + *   - etc. + * + * - Compiler:           IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices:  All AVR32 devices can be used. + * - AppNote: + * + * \author               Atmel Corporation: http://www.atmel.com \n + *                       Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ____________________________________________________ + +#include "compiler.h" +#include "preprocessor.h" +#ifdef FREERTOS_USED +#include "FreeRTOS.h" +#include "semphr.h" +#endif +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#ifdef FREERTOS_USED + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +#define Ctrl_access_lock()    ctrl_access_lock() + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock()  xSemaphoreGive(ctrl_access_semphr) + +//! @} + +//! Handle to the semaphore protecting accesses to LUNs. +static xSemaphoreHandle ctrl_access_semphr = NULL; + +#else + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +#define Ctrl_access_lock()    TRUE + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() + +//! @} + +#endif  // FREERTOS_USED + + +#if MAX_LUN + +/*! \brief Initializes an entry of the LUN descriptor table. + * + * \param lun Logical Unit Number. + * + * \return LUN descriptor table entry initializer. + */ +#if ACCESS_USB == ENABLED && ACCESS_MEM_TO_RAM == ENABLED +#define Lun_desc_entry(lun) \ +  {\ +    TPASTE3(Lun_, lun, _test_unit_ready),\ +    TPASTE3(Lun_, lun, _read_capacity),\ +    TPASTE3(Lun_, lun, _wr_protect),\ +    TPASTE3(Lun_, lun, _removal),\ +    TPASTE3(Lun_, lun, _usb_read_10),\ +    TPASTE3(Lun_, lun, _usb_write_10),\ +    TPASTE3(Lun_, lun, _mem_2_ram),\ +    TPASTE3(Lun_, lun, _ram_2_mem),\ +    TPASTE3(LUN_, lun, _NAME)\ +  } +#elif ACCESS_USB == ENABLED +#define Lun_desc_entry(lun) \ +  {\ +    TPASTE3(Lun_, lun, _test_unit_ready),\ +    TPASTE3(Lun_, lun, _read_capacity),\ +    TPASTE3(Lun_, lun, _wr_protect),\ +    TPASTE3(Lun_, lun, _removal),\ +    TPASTE3(Lun_, lun, _usb_read_10),\ +    TPASTE3(Lun_, lun, _usb_write_10),\ +    TPASTE3(LUN_, lun, _NAME)\ +  } +#elif ACCESS_MEM_TO_RAM == ENABLED +#define Lun_desc_entry(lun) \ +  {\ +    TPASTE3(Lun_, lun, _test_unit_ready),\ +    TPASTE3(Lun_, lun, _read_capacity),\ +    TPASTE3(Lun_, lun, _wr_protect),\ +    TPASTE3(Lun_, lun, _removal),\ +    TPASTE3(Lun_, lun, _mem_2_ram),\ +    TPASTE3(Lun_, lun, _ram_2_mem),\ +    TPASTE3(LUN_, lun, _NAME)\ +  } +#else +#define Lun_desc_entry(lun) \ +  {\ +    TPASTE3(Lun_, lun, _test_unit_ready),\ +    TPASTE3(Lun_, lun, _read_capacity),\ +    TPASTE3(Lun_, lun, _wr_protect),\ +    TPASTE3(Lun_, lun, _removal),\ +    TPASTE3(LUN_, lun, _NAME)\ +  } +#endif + +//! LUN descriptor table. +static const struct +{ +  Ctrl_status (*test_unit_ready)(void); +  Ctrl_status (*read_capacity)(U32 *); +  Bool (*wr_protect)(void); +  Bool (*removal)(void); +#if ACCESS_USB == ENABLED +  Ctrl_status (*usb_read_10)(U32, U16); +  Ctrl_status (*usb_write_10)(U32, U16); +#endif +#if ACCESS_MEM_TO_RAM == ENABLED +  Ctrl_status (*mem_2_ram)(U32, void *); +  Ctrl_status (*ram_2_mem)(U32, const void *); +#endif +  const char *name; +} lun_desc[MAX_LUN] = +{ +#if LUN_0 == ENABLE +  Lun_desc_entry(0), +#endif +#if LUN_1 == ENABLE +  Lun_desc_entry(1), +#endif +#if LUN_2 == ENABLE +  Lun_desc_entry(2), +#endif +#if LUN_3 == ENABLE +  Lun_desc_entry(3), +#endif +#if LUN_4 == ENABLE +  Lun_desc_entry(4), +#endif +#if LUN_5 == ENABLE +  Lun_desc_entry(5), +#endif +#if LUN_6 == ENABLE +  Lun_desc_entry(6), +#endif +#if LUN_7 == ENABLE +  Lun_desc_entry(7) +#endif +}; + +#endif + + +#if GLOBAL_WR_PROTECT == ENABLED +Bool g_wr_protect; +#endif + + +/*! \name Control Interface + */ +//! @{ + + +#ifdef FREERTOS_USED + +Bool ctrl_access_init(void) +{ +  // If the handle to the protecting semaphore is not valid, +  if (!ctrl_access_semphr) +  { +    // try to create the semaphore. +    vSemaphoreCreateBinary(ctrl_access_semphr); + +    // If the semaphore could not be created, there is no backup solution. +    if (!ctrl_access_semphr) return FALSE; +  } + +  return TRUE; +} + + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +static Bool ctrl_access_lock(void) +{ +  // If the semaphore could not be created, there is no backup solution. +  if (!ctrl_access_semphr) return FALSE; + +  // Wait for the semaphore. +  while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); + +  return TRUE; +} + +#endif  // FREERTOS_USED + + +U8 get_nb_lun(void) +{ +#if MEM_USB == ENABLE +  U8 nb_lun; + +  if (!Ctrl_access_lock()) return MAX_LUN; + +  nb_lun = MAX_LUN + host_get_lun(); + +  Ctrl_access_unlock(); + +  return nb_lun; +#else +  return MAX_LUN; +#endif +} + + +U8 get_cur_lun(void) +{ +  return LUN_ID_0; +} + + +Ctrl_status mem_test_unit_ready(U8 lun) +{ +  Ctrl_status status; + +  if (!Ctrl_access_lock()) return CTRL_FAIL; + +  status = +#if MAX_LUN +           (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : +#endif +#if LUN_USB == ENABLE +                             Lun_usb_test_unit_ready(lun - LUN_ID_USB); +#else +                             CTRL_FAIL; +#endif + +  Ctrl_access_unlock(); + +  return status; +} + + +Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) +{ +  Ctrl_status status; + +  if (!Ctrl_access_lock()) return CTRL_FAIL; + +  status = +#if MAX_LUN +           (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : +#endif +#if LUN_USB == ENABLE +                             Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); +#else +                             CTRL_FAIL; +#endif + +  Ctrl_access_unlock(); + +  return status; +} + + +U8 mem_sector_size(U8 lun) +{ +  U8 sector_size; + +  if (!Ctrl_access_lock()) return 0; + +  sector_size = +#if MAX_LUN +                (lun < MAX_LUN) ? 1 : +#endif +#if LUN_USB == ENABLE +                                  Lun_usb_read_sector_size(lun - LUN_ID_USB); +#else +                                  0; +#endif + +  Ctrl_access_unlock(); + +  return sector_size; +} + + +Bool mem_wr_protect(U8 lun) +{ +  Bool wr_protect; + +  if (!Ctrl_access_lock()) return TRUE; + +  wr_protect = +#if MAX_LUN +               (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : +#endif +#if LUN_USB == ENABLE +                                 Lun_usb_wr_protect(lun - LUN_ID_USB); +#else +                                 TRUE; +#endif + +  Ctrl_access_unlock(); + +  return wr_protect; +} + + +Bool mem_removal(U8 lun) +{ +  Bool removal; + +  if (!Ctrl_access_lock()) return TRUE; + +  removal = +#if MAX_LUN +            (lun < MAX_LUN) ? lun_desc[lun].removal() : +#endif +#if LUN_USB == ENABLE +                              Lun_usb_removal(); +#else +                              TRUE; +#endif + +  Ctrl_access_unlock(); + +  return removal; +} + + +const char *mem_name(U8 lun) +{ +  return +#if MAX_LUN +         (lun < MAX_LUN) ? lun_desc[lun].name : +#endif +#if LUN_USB == ENABLE +                           LUN_USB_NAME; +#else +                           NULL; +#endif +} + + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) +{ +  Ctrl_status status; + +  if (!Ctrl_access_lock()) return CTRL_FAIL; + +  memory_start_read_action(nb_sector); +  status = +#if MAX_LUN +           (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : +#endif +                             CTRL_FAIL; +  memory_stop_read_action(); + +  Ctrl_access_unlock(); + +  return status; +} + + +Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) +{ +  Ctrl_status status; + +  if (!Ctrl_access_lock()) return CTRL_FAIL; + +  memory_start_write_action(nb_sector); +  status = +#if MAX_LUN +           (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : +#endif +                             CTRL_FAIL; +  memory_stop_write_action(); + +  Ctrl_access_unlock(); + +  return status; +} + + +//! @} + +#endif  // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) +{ +  Ctrl_status status; + +  if (!Ctrl_access_lock()) return CTRL_FAIL; + +  memory_start_read_action(1); +  status = +#if MAX_LUN +           (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : +#endif +#if LUN_USB == ENABLE +                             Lun_usb_mem_2_ram(addr, ram); +#else +                             CTRL_FAIL; +#endif +  memory_stop_read_action(); + +  Ctrl_access_unlock(); + +  return status; +} + + +Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) +{ +  Ctrl_status status; + +  if (!Ctrl_access_lock()) return CTRL_FAIL; + +  memory_start_write_action(1); +  status = +#if MAX_LUN +           (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : +#endif +#if LUN_USB == ENABLE +                             Lun_usb_ram_2_mem(addr, ram); +#else +                             CTRL_FAIL; +#endif +  memory_stop_write_action(); + +  Ctrl_access_unlock(); + +  return status; +} + + +//! @} + +#endif  // ACCESS_MEM_TO_RAM == ENABLED + + +#if ACCESS_STREAM == ENABLED + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + + +  #if ACCESS_MEM_TO_MEM == ENABLED + +#include "fat.h" + +Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) +{ +#if (defined __GNUC__) && (defined __AVR32__) +  __attribute__((__aligned__(4))) +#elif (defined __ICCAVR32__) +  #pragma data_alignment = 4 +#endif +  static U8 sector_buf[FS_512B]; +  Ctrl_status status = CTRL_GOOD; + +  while (nb_sector--) +  { +    if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; +    if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; +  } + +  return status; +} + +  #endif  // ACCESS_MEM_TO_MEM == ENABLED + + +Ctrl_status stream_state(U8 id) +{ +  return CTRL_GOOD; +} + + +U16 stream_stop(U8 id) +{ +  return 0; +} + + +//! @} + +#endif  // ACCESS_STREAM == ENABLED diff --git a/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h b/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h new file mode 100644 index 0000000..358bf65 --- /dev/null +++ b/firmwares/wifishield/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h @@ -0,0 +1,369 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + *   - MEM <-> USB; + *   - MEM <-> RAM; + *   - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + *   - write-protected globals; + *   - password-protected data; + *   - specific features; + *   - etc. + * + * - Compiler:           IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices:  All AVR32 devices can be used. + * - AppNote: + * + * \author               Atmel Corporation: http://www.atmel.com \n + *                       Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CTRL_ACCESS_H_ +#define _CTRL_ACCESS_H_ + +#include "compiler.h" +#include "conf_access.h" + + +//! Status returned by CTRL_ACCESS interfaces. +typedef enum +{ +  CTRL_GOOD       = PASS,     //!< Success, memory ready. +  CTRL_FAIL       = FAIL,     //!< An error occurred. +  CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. +  CTRL_BUSY       = FAIL + 2  //!< Memory not initialized or changed. +} Ctrl_status; + + +// FYI: Each Logical Unit Number (LUN) corresponds to a memory. + +// Check LUN defines. +#ifndef LUN_0 +  #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_1 +  #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_2 +  #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_3 +  #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_4 +  #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_5 +  #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_6 +  #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_7 +  #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_USB +  #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h +#endif + +/*! \name LUN IDs + */ +//! @{ +#define LUN_ID_0        (0)                 //!< First static LUN. +#define LUN_ID_1        (LUN_ID_0 + LUN_0) +#define LUN_ID_2        (LUN_ID_1 + LUN_1) +#define LUN_ID_3        (LUN_ID_2 + LUN_2) +#define LUN_ID_4        (LUN_ID_3 + LUN_3) +#define LUN_ID_5        (LUN_ID_4 + LUN_4) +#define LUN_ID_6        (LUN_ID_5 + LUN_5) +#define LUN_ID_7        (LUN_ID_6 + LUN_6) +#define MAX_LUN         (LUN_ID_7 + LUN_7)  //!< Number of static LUNs. +#define LUN_ID_USB      (MAX_LUN)           //!< First dynamic LUN (USB host mass storage). +//! @} + + +// Include LUN header files. +#if LUN_0 == ENABLE +  #include LUN_0_INCLUDE +#endif +#if LUN_1 == ENABLE +  #include LUN_1_INCLUDE +#endif +#if LUN_2 == ENABLE +  #include LUN_2_INCLUDE +#endif +#if LUN_3 == ENABLE +  #include LUN_3_INCLUDE +#endif +#if LUN_4 == ENABLE +  #include LUN_4_INCLUDE +#endif +#if LUN_5 == ENABLE +  #include LUN_5_INCLUDE +#endif +#if LUN_6 == ENABLE +  #include LUN_6_INCLUDE +#endif +#if LUN_7 == ENABLE +  #include LUN_7_INCLUDE +#endif +#if LUN_USB == ENABLE +  #include LUN_USB_INCLUDE +#endif + + +// Check the configuration of write protection in conf_access.h. +#ifndef GLOBAL_WR_PROTECT +  #error GLOBAL_WR_PROTECT must be defined as ENABLED or DISABLED in conf_access.h +#endif + + +#if GLOBAL_WR_PROTECT == ENABLED + +//! Write protect. +extern Bool g_wr_protect; + +#endif + + +/*! \name Control Interface + */ +//! @{ + +#ifdef FREERTOS_USED + +/*! \brief Initializes the LUN access locker. + * + * \return \c TRUE if the locker was successfully initialized, else \c FALSE. + */ +extern Bool ctrl_access_init(void); + +#endif  // FREERTOS_USED + +/*! \brief Returns the number of LUNs. + * + * \return Number of LUNs in the system. + */ +extern U8 get_nb_lun(void); + +/*! \brief Returns the current LUN. + * + * \return Current LUN. + * + * \todo Implement. + */ +extern U8 get_cur_lun(void); + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \param lun Logical Unit Number. + * + * \return Status. + */ +extern Ctrl_status mem_test_unit_ready(U8 lun); + +/*! \brief Returns the address of the last valid sector (512 bytes) in the + *         memory. + * + * \param lun           Logical Unit Number. + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); + +/*! \brief Returns the size of the physical sector. + * + * \param lun Logical Unit Number. + * + * \return Sector size (unit: 512 bytes). + */ +extern U8 mem_sector_size(U8 lun); + +/*! \brief Returns the write-protection state of the memory. + * + * \param lun Logical Unit Number. + * + * \return \c TRUE if the memory is write-protected, else \c FALSE. + * + * \note Only used by removable memories with hardware-specific write + *       protection. + */ +extern Bool mem_wr_protect(U8 lun); + +/*! \brief Tells whether the memory is removable. + * + * \param lun Logical Unit Number. + * + * \return \c TRUE if the memory is removable, else \c FALSE. + */ +extern Bool mem_removal(U8 lun); + +/*! \brief Returns a pointer to the LUN name. + * + * \param lun Logical Unit Number. + * + * \return Pointer to the LUN name string. + */ +extern const char *mem_name(U8 lun); + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Tranfers data from the memory to USB. + * + * \param lun       Logical Unit Number. + * \param addr      Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); + +/*! \brief Tranfers data from USB to the memory. + * + * \param lun       Logical Unit Number. + * \param addr      Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); + +//! @} + +#endif  // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param lun   Logical Unit Number. + * \param addr  Address of first memory sector to read. + * \param ram   Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param lun   Logical Unit Number. + * \param addr  Address of first memory sector to write. + * \param ram   Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); + +//! @} + +#endif  // ACCESS_MEM_TO_RAM == ENABLED + + +#if ACCESS_STREAM == ENABLED + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + +//! Erroneous streaming data transfer ID. +#define ID_STREAM_ERR         0xFF + +  #if ACCESS_MEM_TO_MEM == ENABLED + +/*! \brief Copies data from one memory to another. + * + * \param src_lun   Source Logical Unit Number. + * \param src_addr  Source address of first memory sector to read. + * \param dest_lun  Destination Logical Unit Number. + * \param dest_addr Destination address of first memory sector to write. + * \param nb_sector Number of sectors to copy. + * + * \return Status. + */ +extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); + +  #endif  // ACCESS_MEM_TO_MEM == ENABLED + +/*! \brief Returns the state of a streaming data transfer. + * + * \param id  Transfer ID. + * + * \return Status. + * + * \todo Implement. + */ +extern Ctrl_status stream_state(U8 id); + +/*! \brief Stops a streaming data transfer. + * + * \param id  Transfer ID. + * + * \return Number of remaining sectors. + * + * \todo Implement. + */ +extern U16 stream_stop(U8 id); + +//! @} + +#endif  // ACCESS_STREAM == ENABLED + + +#endif  // _CTRL_ACCESS_H_ | 
