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...
 

#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 ctrl_access_semphr.

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 ctrl_access_semphr, and xSemaphoreTake.

U8 get_cur_lun ( void  )

Returns the current LUN.

Returns
Current LUN.
Todo:
Implement.

References LUN_ID_0.

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.

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, and UNUSED.

Referenced by udi_msc_spc_inquiry().

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 udi_msc_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.

Referenced by udi_msc_spc_inquiry().

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.

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 udi_msc_spc_testunitready_global().

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.

Referenced by udi_msc_sbc_start_stop().

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 udi_msc_sbc_trans(), and udi_msc_spc_mode_sense().

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 udi_msc_process_trans().

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 udi_msc_process_trans().