In the socket services open() function, we assign a name for the driver and then process any options. If no options are specified, a default size is assigned and the memory for the (virtual) flash is allocated.
/*
** File: f3s_ram_open.c
**
** Description:
**
** This file contains the open function for the ram library
**
*/
#include "f3s_ram.h"
int32_t f3s_ram_open(f3s_socket_t *socket,
uint32_t flags)
{
static void * memory;
char name[8];
int fd;
int flag;
/* check if not initialized */
if (!memory)
{
/* get io privileges */
ThreadCtl(_NTO_TCTL_IO, NULL);
/* setup socket name */
socket->name = "RAM (flash simulation)";
/* check if there are socket options */
if (f3s_socket_option(socket))
socket->window_size = 1024 * 1024;
/* check if array size was not chosen */
if (!socket->array_size)
socket->array_size = socket->window_size;
/* check if array size was not specified */
if (!socket->array_size) return (ENXIO);
/* set shared memory name */
sprintf(name, "/fs%X", socket->socket_index);
/* open shared memory */
fd = shm_open(name, O_CREAT | O_RDWR, 0777);
if (fd < 0) return (errno);
/* set size of shared memory */
flag = ftruncate(fd, socket->array_size);
if (flag)
{
close(fd);
return (errno);
}
/* map physical address into memory */
memory = mmap(NULL, socket->array_size,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, socket->address);
if (!memory)
{
close(fd);
return (errno);
}
/* copy socket handle */
socket->socket_handle = (void *)fd;
}
/* set socket memory pointer to previously initialized
value */
socket->memory = memory;
return (EOK);
}