virtual_mem.h File Reference


Detailed Description

Management of the virtual memory.

This file manages the virtual memory.

Author:
Atmel Corporation: http://www.atmel.com
Support and FAQ: http://support.atmel.no/

Definition in file virtual_mem.h.

#include "conf_access.h"
#include "ctrl_access.h"

Go to the source code of this file.

Defines

#define ENTRY_SIZE   32
 FAT specification.
#define FAT_SECTOR   (PBR_SECTOR + VMEM_RESERVED_SIZE)
#define FILE_SECTOR   (ROOT_SECTOR + VMEM_NB_ROOT_ENTRY * ENTRY_SIZE / VMEM_SECTOR_SIZE)
#define FILE_SIZE   16
#define PBR_SECTOR   0
#define ROOT_SECTOR   (FAT_SECTOR + VMEM_NB_FATS * VMEM_SIZE_FAT)
#define VMEM_CLUSTER_SIZE   1
#define VMEM_MEDIA_TYPE   0xF8
#define VMEM_NB_FATS   2
#define VMEM_NB_HEAD   1
#define VMEM_NB_HIDDEN_SECT   0
#define VMEM_NB_ROOT_ENTRY   16
#define VMEM_NB_SECTOR   (FILE_SIZE * VMEM_CLUSTER_SIZE + FILE_SECTOR)
#define VMEM_RESERVED_SIZE   1
#define VMEM_SECT_PER_TRACK   1
#define VMEM_SECTOR_SIZE   512
 Value of virtual PBR.
#define VMEM_SIZE_FAT   1
#define VMEN_DRIVE_NUMBER   0x80

Functions

Ctrl_status virtual_mem_2_ram (U32 addr, void *ram)
 This function tranfers 1 data sector from memory to RAM sector = 512 bytes.
Ctrl_status virtual_ram_2_mem (U32 addr, const void *ram)
 This function tranfers 1 data sector from memory to RAM sector = 512 bytes.
Ctrl_status virtual_read_capacity (U32 *u32_nb_sector)
 This function returns the address of the last valid sector.
Bool virtual_removal (void)
 This function informs about the memory type.
Ctrl_status virtual_test_unit_ready (void)
 This function tests memory state, and starts memory initialization.
Ctrl_status virtual_usb_read_10 (U32 addr, U16 nb_sector)
 This function transfers the memory data (programmed in sbc_read_10) directly to the USB interface sector = 512 bytes.
Ctrl_status virtual_usb_write_10 (U32 addr, U16 nb_sector)
 This function transfers the USB data (programmed in sbc_write_10) directly to the memory interface sector = 512 bytes.
Bool virtual_wr_protect (void)
 This function returns the write-protected mode Only used by memory removal with a HARDWARE-SPECIFIC write-protected detection.


Define Documentation

#define ENTRY_SIZE   32

FAT specification.

Definition at line 65 of file virtual_mem.h.

#define FAT_SECTOR   (PBR_SECTOR + VMEM_RESERVED_SIZE)

Definition at line 86 of file virtual_mem.h.

Referenced by virtual_check_init().

#define FILE_SECTOR   (ROOT_SECTOR + VMEM_NB_ROOT_ENTRY * ENTRY_SIZE / VMEM_SECTOR_SIZE)

Definition at line 88 of file virtual_mem.h.

Referenced by virtual_ram_2_mem(), and virtual_usb_write_10().

#define FILE_SIZE   16

Definition at line 90 of file virtual_mem.h.

#define PBR_SECTOR   0

Definition at line 85 of file virtual_mem.h.

Referenced by virtual_check_init().

#define ROOT_SECTOR   (FAT_SECTOR + VMEM_NB_FATS * VMEM_SIZE_FAT)

Definition at line 87 of file virtual_mem.h.

#define VMEM_CLUSTER_SIZE   1

Definition at line 69 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_MEDIA_TYPE   0xF8

Definition at line 75 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_NB_FATS   2

Definition at line 72 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_NB_HEAD   1

Definition at line 79 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_NB_HIDDEN_SECT   0

Definition at line 81 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_NB_ROOT_ENTRY   16

Definition at line 73 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_NB_SECTOR   (FILE_SIZE * VMEM_CLUSTER_SIZE + FILE_SECTOR)

#define VMEM_RESERVED_SIZE   1

Definition at line 70 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_SECT_PER_TRACK   1

Definition at line 78 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEM_SECTOR_SIZE   512

Value of virtual PBR.

Definition at line 68 of file virtual_mem.h.

Referenced by virtual_check_init(), virtual_mem_2_ram(), virtual_ram_2_mem(), virtual_usb_read_10(), and virtual_usb_write_10().

#define VMEM_SIZE_FAT   1

Definition at line 76 of file virtual_mem.h.

Referenced by virtual_check_init().

#define VMEN_DRIVE_NUMBER   0x80

Definition at line 82 of file virtual_mem.h.

Referenced by virtual_check_init().


Function Documentation

Ctrl_status virtual_mem_2_ram ( U32  addr,
void *  ram 
)

This function tranfers 1 data sector from memory to RAM sector = 512 bytes.

Parameters:
addr Sector address to start read
ram Address of RAM buffer
Returns:
Ctrl_status It is ready -> CTRL_GOOD Memory unplug -> CTRL_NO_PRESENT Not initialized or changed -> CTRL_BUSY An error occurred -> CTRL_FAIL

Definition at line 330 of file virtual_mem.c.

References virtual_check_init(), vmem_data, VMEM_NB_SECTOR, and VMEM_SECTOR_SIZE.

00331 {
00332   virtual_check_init();
00333   if (addr + 1 > Max(VMEM_NB_SECTOR, 8)) return CTRL_FAIL;
00334 
00335   // If overflow (possible with size virtual mem < 8 sectors) then read the last sector
00336   addr = min(addr, VMEM_NB_SECTOR - 1);
00337 
00338   memcpy(ram, &vmem_data[addr * VMEM_SECTOR_SIZE], VMEM_SECTOR_SIZE);
00339 
00340   return CTRL_GOOD;
00341 }

Ctrl_status virtual_ram_2_mem ( U32  addr,
const void *  ram 
)

This function tranfers 1 data sector from memory to RAM sector = 512 bytes.

Parameters:
addr Sector address to start write
ram Address of RAM buffer
Returns:
Ctrl_status It is ready -> CTRL_GOOD Memory unplug -> CTRL_NO_PRESENT Not initialized or changed -> CTRL_BUSY An error occurred -> CTRL_FAIL

Definition at line 353 of file virtual_mem.c.

References FILE_SECTOR, s_b_data_modify, virtual_check_init(), vmem_data, VMEM_NB_SECTOR, and VMEM_SECTOR_SIZE.

00354 {
00355   virtual_check_init();
00356   if (addr + 1 > VMEM_NB_SECTOR) return CTRL_FAIL;
00357 
00358 #if VIRTUAL_MEM_TEST_CHANGE_STATE == ENABLED
00359   if (addr + 1 > FILE_SECTOR && addr <= FILE_SECTOR)
00360     s_b_data_modify = TRUE;
00361 #endif
00362 
00363   memcpy(&vmem_data[addr * VMEM_SECTOR_SIZE], ram, VMEM_SECTOR_SIZE);
00364 
00365   return CTRL_GOOD;
00366 }

Ctrl_status virtual_read_capacity ( U32 *  u32_nb_sector  ) 

This function returns the address of the last valid sector.

Parameters:
u32_nb_sector Pointer to number of sectors (sector = 512 bytes)
Returns:
Ctrl_status It is ready -> CTRL_GOOD Memory unplug -> CTRL_NO_PRESENT Not initialized or changed -> CTRL_BUSY An error occurred -> CTRL_FAIL

Definition at line 191 of file virtual_mem.c.

References virtual_check_init(), and VMEM_NB_SECTOR.

00192 {
00193   virtual_check_init();
00194   *u32_nb_sector = Max(VMEM_NB_SECTOR, 8) - 1;
00195 
00196   return CTRL_GOOD;
00197 }

Bool virtual_removal ( void   ) 

This function informs about the memory type.

Returns:
TRUE if the memory is removable

Definition at line 212 of file virtual_mem.c.

00213 {
00214   return FALSE;
00215 }

Ctrl_status virtual_test_unit_ready ( void   ) 

This function tests memory state, and starts memory initialization.

Returns:
Ctrl_status It is ready -> CTRL_GOOD Memory unplug -> CTRL_NO_PRESENT Not initialized or changed -> CTRL_BUSY An error occurred -> CTRL_FAIL

Definition at line 176 of file virtual_mem.c.

References virtual_check_init().

00177 {
00178   virtual_check_init();
00179 
00180   return CTRL_GOOD;
00181 }

Ctrl_status virtual_usb_read_10 ( U32  addr,
U16  nb_sector 
)

This function transfers the memory data (programmed in sbc_read_10) directly to the USB interface sector = 512 bytes.

Parameters:
addr Sector address to start read
nb_sector Number of sectors to transfer
Returns:
Ctrl_status It is ready -> CTRL_GOOD Memory unplug -> CTRL_NO_PRESENT Not initialized or changed -> CTRL_BUSY An error occurred -> CTRL_FAIL

Definition at line 234 of file virtual_mem.c.

References data_to_transfer, g_scsi_ep_ms_in, virtual_check_init(), vmem_data, VMEM_NB_SECTOR, and VMEM_SECTOR_SIZE.

00235 {
00236   const void *ptr_cram;
00237   U16 data_to_transfer;
00238 
00239   virtual_check_init();
00240   if (addr + nb_sector > Max(VMEM_NB_SECTOR, 8)) return CTRL_FAIL;
00241 
00242   while (nb_sector--)
00243   {
00244     // If overflow (possible with size virtual mem < 8 sectors) then read the last sector
00245     addr = min(addr, VMEM_NB_SECTOR - 1);
00246 
00247     ptr_cram = &vmem_data[addr++ * VMEM_SECTOR_SIZE];
00248     data_to_transfer = VMEM_SECTOR_SIZE;
00249     while (data_to_transfer)
00250     {
00251       while (!Is_usb_in_ready(g_scsi_ep_ms_in))
00252       {
00253          if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in))
00254             return CTRL_FAIL; // USB Reset
00255       }         
00256 
00257       Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in);
00258       data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, ptr_cram,
00259                                                data_to_transfer, &ptr_cram);
00260       Usb_ack_in_ready_send(g_scsi_ep_ms_in);
00261     }
00262   }
00263 
00264   return CTRL_GOOD;
00265 }

Ctrl_status virtual_usb_write_10 ( U32  addr,
U16  nb_sector 
)

This function transfers the USB data (programmed in sbc_write_10) directly to the memory interface sector = 512 bytes.

Parameters:
addr Sector address to start write
nb_sector Number of sectors to transfer
Returns:
Ctrl_status It is ready -> CTRL_GOOD Memory unplug -> CTRL_NO_PRESENT Not initialized or changed -> CTRL_BUSY An error occurred -> CTRL_FAIL

Definition at line 277 of file virtual_mem.c.

References data_to_transfer, FILE_SECTOR, g_scsi_ep_ms_out, s_b_data_modify, virtual_check_init(), vmem_data, VMEM_NB_SECTOR, and VMEM_SECTOR_SIZE.

00278 {
00279   void *ptr_cram;
00280   U16 data_to_transfer;
00281 
00282   virtual_check_init();
00283   if (addr + nb_sector > VMEM_NB_SECTOR) return CTRL_FAIL;
00284 
00285 #if VIRTUAL_MEM_TEST_CHANGE_STATE == ENABLED
00286   if (addr + nb_sector > FILE_SECTOR && addr <= FILE_SECTOR)
00287     s_b_data_modify = TRUE;
00288 #endif
00289 
00290   ptr_cram = &vmem_data[addr * VMEM_SECTOR_SIZE];
00291   while (nb_sector--)
00292   {
00293     data_to_transfer = VMEM_SECTOR_SIZE;
00294     while (data_to_transfer)
00295     {
00296       while (!Is_usb_out_received(g_scsi_ep_ms_out))
00297       {
00298          if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out))
00299             return CTRL_FAIL; // USB Reset
00300       }         
00301 
00302       Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out);
00303       data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, ptr_cram,
00304                                               data_to_transfer, &ptr_cram);
00305       Usb_ack_out_received_free(g_scsi_ep_ms_out);
00306     }
00307   }
00308 
00309   return CTRL_GOOD;
00310 }

Bool virtual_wr_protect ( void   ) 

This function returns the write-protected mode Only used by memory removal with a HARDWARE-SPECIFIC write-protected detection.

Warning:
The customer must unplug the memory to change this write-protected mode.
Returns:
TRUE if the memory is protected

Definition at line 204 of file virtual_mem.c.

00205 {
00206   return FALSE;
00207 }


Generated on Fri Feb 19 02:34:04 2010 for AVR32 - USB Mass-Storage Stand-alone Example by  doxygen 1.5.5