Microchip® Advanced Software Framework

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Memory Control Access

Common abstraction layer for memory interfaces.

It provides interfaces between: Memory and USB, Memory and RAM, Memory and Memory. Common API for XMEGA and UC3.

Macros

#define SECTOR_SIZE   512
 

Enumerations

enum  Ctrl_status {
  CTRL_GOOD = PASS,
  CTRL_FAIL = FAIL,
  CTRL_NO_PRESENT = FAIL + 1,
  CTRL_BUSY = FAIL + 2
}
 Status returned by CTRL_ACCESS interfaces. More...
 

Control Interface

static bool ctrl_access_lock (void)
 Locks accesses to LUNs. More...
 

LUN IDs

#define LUN_ID_0   (0)
 First static LUN. More...
 
#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. More...
 
#define LUN_ID_USB   (MAX_LUN)
 First dynamic LUN (USB host mass storage). More...
 

Control Interface

bool ctrl_access_init (void)
 Initializes the LUN access locker. More...
 
U8 get_nb_lun (void)
 Returns the number of LUNs. More...
 
U8 get_cur_lun (void)
 Returns the current LUN. More...
 
Ctrl_status mem_test_unit_ready (U8 lun)
 Tests the memory state and initializes the memory if required. More...
 
Ctrl_status mem_read_capacity (U8 lun, U32 *u32_nb_sector)
 Returns the address of the last valid sector (512 bytes) in the memory. More...
 
U8 mem_sector_size (U8 lun)
 Returns the size of the physical sector. More...
 
bool mem_unload (U8 lun, bool unload)
 Unload/load the medium. More...
 
bool mem_wr_protect (U8 lun)
 Returns the write-protection state of the memory. More...
 
bool mem_removal (U8 lun)
 Tells whether the memory is removable. More...
 
const char * mem_name (U8 lun)
 Returns a pointer to the LUN name. More...
 

MEM <-> USB Interface

Ctrl_status memory_2_usb (U8 lun, U32 addr, U16 nb_sector)
 Transfers data from the memory to USB. More...
 
Ctrl_status usb_2_memory (U8 lun, U32 addr, U16 nb_sector)
 Transfers data from USB to the memory. More...
 

MEM <-> RAM Interface

Ctrl_status memory_2_ram (U8 lun, U32 addr, void *ram)
 Copies 1 data sector from the memory to RAM. More...
 
Ctrl_status ram_2_memory (U8 lun, U32 addr, const void *ram)
 Copies 1 data sector from RAM to the memory. More...
 

Streaming MEM <-> MEM Interface

Ctrl_status stream_mem_to_mem (U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector)
 Copies data from one memory to another. More...
 
Ctrl_status stream_state (U8 id)
 Returns the state of a streaming data transfer. More...
 
U16 stream_stop (U8 id)
 Stops a streaming data transfer. More...
 
#define ID_STREAM_ERR   0xFF
 Erroneous streaming data transfer ID. More...
 

#define ID_STREAM_ERR   0xFF

Erroneous streaming data transfer ID.

Referenced by nav_file_paste_start(), and nav_file_paste_state().

#define LUN_ID_0   (0)

First static LUN.

Referenced by get_cur_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 LUN_ID_USB   (MAX_LUN)

First dynamic LUN (USB host mass storage).

Referenced by mem_read_capacity(), mem_sector_size(), mem_test_unit_ready(), mem_unload(), and mem_wr_protect().

#define SECTOR_SIZE   512

Status returned by CTRL_ACCESS interfaces.

Enumerator
CTRL_GOOD 

Success, memory ready.

CTRL_FAIL 

An error occurred.

CTRL_NO_PRESENT 

Memory unplugged.

CTRL_BUSY 

Memory not initialized or changed.

bool ctrl_access_init ( void  )

Initializes the LUN access locker.

Returns
true if the locker was successfully initialized, else false.

References vSemaphoreCreateBinary.

Referenced by main().

static bool ctrl_access_lock ( void  )
static

Locks accesses to LUNs.

Returns
true if the access was successfully locked, else false.

References xSemaphoreTake.

U8 get_cur_lun ( void  )

Returns the current LUN.

Returns
Current LUN.
Todo:
Implement.

References LUN_ID_0.

Referenced by usb_mass_storage_cbw().

U8 get_nb_lun ( void  )

Returns the number of LUNs.

Returns
Number of LUNs in the system.

References Ctrl_access_lock, Ctrl_access_unlock, Lun_usb_get_lun, and MAX_LUN.

Referenced by nav_drive_nb(), nav_drive_set(), and usb_user_read_request().

const char* mem_name ( U8  lun)

Returns a pointer to the LUN name.

Parameters
lunLogical Unit Number.
Returns
Pointer to the LUN name string.

References ENABLE, lun_desc, LUN_USB, LUN_USB_NAME, MAX_LUN, name, NULL, and UNUSED.

Referenced by prv_df(), and prv_ls().

Ctrl_status mem_read_capacity ( U8  lun,
U32 u32_nb_sector 
)

Returns the address of the last valid sector (512 bytes) in the memory.

Parameters
lunLogical Unit Number.
u32_nb_sectorPointer to the address of the last valid sector.
Returns
Status.

References Ctrl_access_lock, Ctrl_access_unlock, CTRL_FAIL, lun_desc, LUN_ID_USB, Lun_usb_read_capacity, MAX_LUN, and read_capacity.

Referenced by fat_format(), and sbc_read_capacity().

bool mem_removal ( U8  lun)

Tells whether the memory is removable.

Parameters
lunLogical Unit Number.
Returns
true if the memory is removable, else false.

References Ctrl_access_lock, Ctrl_access_unlock, lun_desc, Lun_usb_removal, MAX_LUN, removal, and UNUSED.

U8 mem_sector_size ( U8  lun)

Returns the size of the physical sector.

Parameters
lunLogical Unit Number.
Returns
Sector size (unit: 512 bytes).

References Ctrl_access_lock, Ctrl_access_unlock, ENABLE, LUN_ID_USB, LUN_USB, Lun_usb_read_sector_size, and MAX_LUN.

Referenced by fat_mount().

Ctrl_status mem_test_unit_ready ( U8  lun)

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.

Parameters
lunLogical Unit Number.
Returns
Status.

References Ctrl_access_lock, Ctrl_access_unlock, CTRL_FAIL, lun_desc, LUN_ID_USB, Lun_usb_test_unit_ready, MAX_LUN, and test_unit_ready.

Referenced by fat_check_device(), main(), and sbc_test_unit_ready().

bool mem_unload ( U8  lun,
bool  unload 
)

Unload/load the medium.

Parameters
lunLogical Unit Number.
unloadtrue to unload the medium, false to load the medium.
Returns
true if unload/load success, else false.

References Ctrl_access_lock, Ctrl_access_unlock, ENABLE, lun_desc, LUN_ID_USB, LUN_USB, MAX_LUN, unload, and UNUSED.

bool mem_wr_protect ( U8  lun)

Returns the write-protection state of the memory.

Parameters
lunLogical Unit Number.
Returns
true if the memory is write-protected, else false.
Note
Only used by removable memories with hardware-specific write protection.

References Ctrl_access_lock, Ctrl_access_unlock, lun_desc, LUN_ID_USB, Lun_usb_wr_protect, MAX_LUN, and wr_protect.

Referenced by fat_cache_flush(), file_open(), nav_file_isreadonly(), sbc_header_mode_sense(), and sbc_write_10().

Ctrl_status memory_2_ram ( U8  lun,
U32  addr,
void ram 
)

Copies 1 data sector from the memory to RAM.

Parameters
lunLogical Unit Number.
addrAddress of first memory sector to read.
ramPointer to RAM buffer to write.
Returns
Status.

References Ctrl_access_lock, Ctrl_access_unlock, CTRL_FAIL, lun_desc, Lun_usb_mem_2_ram, MAX_LUN, mem_2_ram, memory_start_read_action, memory_stop_read_action, and UNUSED.

Referenced by fat_cache_read_sector(), file_read_buf(), and stream_mem_to_mem().

Ctrl_status memory_2_usb ( U8  lun,
U32  addr,
U16  nb_sector 
)

Transfers data from the memory to USB.

Parameters
lunLogical Unit Number.
addrAddress of first memory sector to read.
nb_sectorNumber of sectors to transfer.
Returns
Status.

References Ctrl_access_lock, Ctrl_access_unlock, CTRL_FAIL, lun_desc, MAX_LUN, memory_start_read_action, memory_stop_read_action, and usb_read_10.

Referenced by sbc_read_10().

Ctrl_status ram_2_memory ( U8  lun,
U32  addr,
const void ram 
)

Copies 1 data sector from RAM to the memory.

Parameters
lunLogical Unit Number.
addrAddress of first memory sector to write.
ramPointer to RAM buffer to read.
Returns
Status.

References Ctrl_access_lock, Ctrl_access_unlock, CTRL_FAIL, lun_desc, Lun_usb_ram_2_mem, MAX_LUN, memory_start_write_action, memory_stop_write_action, ram_2_mem, and UNUSED.

Referenced by fat_cache_flush(), file_write_buf(), and stream_mem_to_mem().

Ctrl_status stream_mem_to_mem ( U8  src_lun,
U32  src_addr,
U8  dest_lun,
U32  dest_addr,
U16  nb_sector 
)

Copies data from one memory to another.

Parameters
src_lunSource Logical Unit Number.
src_addrSource address of first memory sector to read.
dest_lunDestination Logical Unit Number.
dest_addrDestination address of first memory sector to write.
nb_sectorNumber of sectors to copy.
Returns
Status.

References COMPILER_ALIGNED, CTRL_GOOD, FS_512B, memory_2_ram(), ram_2_memory(), and sector_buf.

Referenced by nav_file_paste_state().

Ctrl_status stream_state ( U8  id)

Returns the state of a streaming data transfer.

Parameters
idTransfer ID.
Returns
Status.
Todo:
Implement.

References CTRL_GOOD, and UNUSED.

Referenced by nav_file_paste_state().

U16 stream_stop ( U8  id)

Stops a streaming data transfer.

Parameters
idTransfer ID.
Returns
Number of remaining sectors.
Todo:
Implement.

References UNUSED.

Referenced by nav_file_paste_state().

Ctrl_status usb_2_memory ( U8  lun,
U32  addr,
U16  nb_sector 
)

Transfers data from USB to the memory.

Parameters
lunLogical Unit Number.
addrAddress of first memory sector to write.
nb_sectorNumber of sectors to transfer.
Returns
Status.

References Ctrl_access_lock, Ctrl_access_unlock, CTRL_FAIL, lun_desc, MAX_LUN, memory_start_write_action, memory_stop_write_action, and usb_write_10.

Referenced by sbc_write_10().