FORGOT YOUR DETAILS?

CREATE ACCOUNT

Unison Help

  1. Unison Kernel
    1. Pthreads
      1. pthread_create()
      2. pthread_exit()
      3. pthread_self()
      4. pthread_equal()
      5. pthread_join()
      6. pthread_detach()
      7. pthread_setschedparam()
      8. pthread_getschedparam()
      9. pthread_attr_init()
      10. pthread_attr_destroy()
      11. pthread_attr_setstackaddr()
      12. pthread_attr_getstackaddr()
      13. pthread_attr_setstacksize()
      14. pthread_attr_getstacksize()
      15. pthread_attr_setschedparam()
      16. pthread_attr_getschedparam()
      17. pthread_attr_setdetachstate()
      18. pthread_attr_getdetachstate()
      19. pthread_stackinfo()
      20. pthread_setprio()
      21. pthread_getprio()
      22. sched_get_priority_max()
      23. sched_get_priority_min()
      24. sched_yield()
    2. Pthread Cancellation
      1. pthread_cleanup_pop()
      2. pthread_cleanup_push()
      3. pthread_cancel()
      4. pthread_setcanceltype()
      5. pthread_setcancelstate()
      6. pthread_testcancel()
    3. Mutex
      1. pthread_mutex_init()
      2. pthread_mutex_destroy()
      3. pthread_mutex_lock()
      4. pthread_mutex_trylock()
      5. pthread_mutex_unlock()
    4. Semaphores
      1. sem_open()
      2. sem_close()
      3. sem_unlink()
      4. sem_init()
      5. sem_destroy()
      6. sem_wait()
      7. sem_trywait()
      8. sem_timedwait()
      9. sem_post()
      10. sem_getvalue()
    5. Message Queues
      1. mq_open()
      2. mq_close()
      3. mq_unlink()
      4. mq_send()
      5. mq_receive()
      6. mq_notify()
      7. mq_setattr()
      8. mq_getattr()
      9. mq_timedreceive()
      10. mq_timedsend()
    6. Conditional Variables
      1. pthread_cond_init()
      2. pthread_cond_destroy()
      3. pthread_cond_wait()
      4. pthread_cond_timedwait()
      5. pthread_cond_signal()
      6. pthread_cond_broadcast()
      7. pthread_condattr_init()
      8. pthread_condattr_destroy()
    7. Barriers
      1. pthread_barrier_init()
      2. pthread_barrier_destroy()
      3. pthread_barrier_wait()
    8. Timers
      1. timer_create()
      2. timer_delete()
      3. timer_settime()
      4. timer_gettime()
      5. timer_getoverrun()
      6. timer_tick()
      7. nanosleep()
    9. Clocks
      1. time()
      2. uptime()
      3. sleep()
      4. clock_settime()
      5. clock_gettime()
      6. clock_getres()
      7. clock_init()
    10. Memory Allocation
      1. POSIX.1
        1. malloc()
        2. free()
      2. Variable Length (Pools)
        1. pool_create()
        2. pool_destroy()
        3. pool_alloc()
        4. pool_free()
      3. Fixed Length (Partitions)
        1. pt_create()
        2. pt_destroy()
        3. pt_getblock()
        4. pt_freeblock()
    11. Rendezvous
      1. mr_init()
      2. mr_send()
      3. mr_receive()
      4. mr_reply()
      5. mr_sigrecv()
      6. mr_sigpost()
    12. Interrupts
      1. interrupts
      2. i_disable()
      3. i_restore()
    13. Directory Services
      1. dir_register()
      2. dir_deregister()
      3. dir_lookup()
      4. dir_lookup_string()
    14. Miscellaneous
      1. checkIstack()
      2. NanoStart() or DSPexec_Start()
      3. _isrStackFill
      4. Kernel Scaling
      5. kfatal()
      6. kalloc()
      7. kfree()
      8. mpu or mmu
      9. pthreadStackFill
      10. thread_numb()
      11. thread_utilization_start()
      12. thread_utilization_stop()
      13. xprintf()
      14. xputs()
      15. xputchar()
  2. Unison I/O Library
    1. accept()
    2. bind()
    3. chmod()
    4. close()
    5. connect()
    6. creat()
    7. fstat()
    8. getpeername()
    9. getsockname()
    10. getsockopt()
    11. ioctl()
    12. link()
    13. listen()
    14. lseek()
    15. mkdir()
    16. mkfs()
    17. mount()
    18. open()
    19. read()
    20. recv()
    21. recvfrom()
    22. rename()
    23. renameat()
    24. rmdir()
    25. select()
    26. send()
    27. sendto()
    28. setsockopt()
    29. shutdown()
    30. socket()
    31. stat()
    32. sync()
    33. umount()
    34. unlink()
    35. write()
  3. Unison STDIO Library
    1. STDIO Library Calls
      1. clearerr()
      2. dprintf()
      3. fclose()
      4. fdopen()
      5. feof()
      6. ferror()
      7. fileno()
      8. fflush()
      9. fgetc()
      10. fgetpos()
      11. fgets()
      12. fopen()
      13. fprintf()
      14. fputc()
      15. fputs()
      16. fread()
      17. freopen()
      18. fscanf()
      19. fseek()
      20. fseeko()
      21. fsetpos()
      22. ftell()
      23. ftello()
      24. fwrite()
      25. getc()
      26. getc_unlocked()
      27. getchar()
      28. getchar_unlocked()
      29. getdelim()
      30. getline()
      31. gets()
      32. get_stderr_ptr()
      33. get_stdin_ptr()
      34. get_stdout_ptr()
      35. noperprintf()
      36. perprintf()
      37. perror()
      38. posix_compat()
      39. printf()
      40. putc()
      41. putc_unlocked()
      42. putchar()
      43. putchar_unlocked()
      44. puts()
      45. remove()
      46. rewind()
      47. scanf()
      48. setbuf()
      49. setvbuf()
      50. snprintf()
      51. sprintf()
      52. sscanf()
      53. stderr_init()
      54. stderr_close()
      55. stdin_init()
      56. stdin_close()
      57. stdout_init()
      58. stdout_close()
      59. vdprintf()
      60. vscanf()
      61. vsscanf()
      62. vfscanf()
      63. vprintf()
      64. vsnprintf()
      65. vsprintf()
      66. vfprintf()
      67. ungetc()
    2. Do-nothing Stubs
      1. ctermid()
      2. flockfile()
      3. fmemopen()
      4. ftrylockfile()
      5. open_memstream()
      6. pclose()
      7. popen()
      8. tempnam()
      9. tmpfile()
      10. tmpnam()
  4. Unison LIBC Library
    1. LIBC Library Calls
      1. assert()
      2. realloc()
      3. strcasecmp()
      4. strdup()
      5. strncasecmp()
      6. strftime()
    2. Do-nothing Stubs
      1. abort()
      2. execve()
      3. exit()
      4. _Exit()
      5. fork()
      6. getpid()
      7. isatty()
      8. kill()
      9. sbrk()
      10. times()
      11. wait()
    3. Do-nothing Wide-character Stubs
      1. <wchar.h>
      2. <wctype.h>
  5. Unison I/O Servers
    1. File Servers
      1. Multimedia File Server - fsys
      2. FAT File System - fatfs
      3. NAND File Server - nandfsys
      4. NOR File Server - norfsys
      5. Network File Server - nfs
  6. Graphics, Camera, Video, Audio
    1. Vendor Graphics
    2. Prism++ Graphics
    3. ADPCM Services - adpcmd
    4. Camera
  7. Network Protocols
    1. TCP and UDP Server - tcpd
      1. IPv4 only server
      2. IPv4/IPv6 server
    2. DHCP Client Service - dhcp client
    3. DHCP Server - dhcpd
    4. Telnet Server - telnetd
    5. Tiny FTP Server - tftpd
    6. Point to Point - pppd
    7. Network Translation - NAT with PAT
    8. Firewall
      1. Packet filter: pf
      2. Packet filter control: pfctl
      3. Fitler rules: pf.filtering
      4. Translation rules: pf.nat
    9. Tiny HTTP Server - thttpd
    10. Tiny HTTP Server with TLS
    11. POP3 Server
    12. Simple Mail Transfer Protocol Services (SMTP)
    13. Bootp Protocol
    14. File Transfer Protocol Server (FTP)
    15. File Transfer Client Services
    16. RPC / XDR
    17. DNS Client
    18. HTTP/HTTPS Client
    19. REST Client
    20. AutoIP Service - autoip client
    21. mDNS server - mdnsd
    22. SNTP Client
    23. SNMP Agent - Snmpd server
    24. SSL/TLS library
    25. SSH server
    26. IP security
      1. IPsec description
      2. IPsec administration: ipsecadm
      3. Virtual Private Network: VPN
    27. Power Control
      1. Motor and Motion Control Servers
      2. PWM, Encoders
    28. Serial I/O
      1. Asynchronous Serial I/O Server - ttyserver
      2. CAN Server - cand
      3. I2C Server - i2cd
      4. I2S Server - i2sd
    29. System Services
      1. Power Management Servers
      2. Login Service - login_services
      3. XML
      4. POSIX Shell and Login Service - posh
    30. Universal Serial Bus (USB)
      1. USB Server
      2. USB Device Server
      3. USB Embedded Host Server
    31. Wireless
      1. Wireless Servers and Drivers
      2. 802.15.4 Radio Servers
      3. TCP/v6 with 6loWPAN
      4. ZigBee
      5. BlueTooth Server
      6. 802.11 Wi-Fi
      7. GPRS, UHF and GPS Radio Servers
    32. Remedy Tools for Unison
      1. Remedy Data Logging and Event Display Tools
      2. Remedy Diagnostics
      3. Remedy Flash Downloader/Bootloader
      4. Remedy Power On Self Test - POST
      5. Remedy OS Object Viewer
      6. Remedy Remote Control Tools

5.1.3.NAND File Server - nandfsys #

NAME

NAND Flash File Server – nandfsys

SYNOPSIS

#include <fsysinit.h>

#include <device.h>

#include <fsys.h>

#include <nand_flash.h>

pthread_create(&tid, &attr, (void *(*)(void*))_nand_file_server, (char*)&fsysinit)
THREAD _nand_file_server( (char *)&fsysinit)
struct fsysinit {
        uint_16 fsi_msgsize;
        uint_16 fsi_nclones;    /* Number of servers to create. */
        uint_32 fsi_datalog;    /* datlog bit definition */
        uint_16 fsi_nbuffers;   /* Number of buffers in buffer cache, minimum 2*/
        uint_16 fsi_blocksize;  /* Memory block size: 256 for NAND Flash, 512 for sd/mmc-card */
        uint_16 fsi_maxopen;    /* Max number of open files */
        uint_16 fsi_ndrives;    /* Maximum number of allocated disks, valid for FATFS only*/
};

DESCRIPTION

The NAND Flash file server fsys is Linux compatible file system with NAND Flash . File can use RAM disc or SD card or equivalent or NAND flash depending of low level driver implementation specified in demo application. The files are devstrad.c, nand_flash.c and nand_flash.h (see example below)

Nandfsys supports the following operations:

mkfs
make a file system, minor device numbers are used for different partitions
mount
mount a file system at a specific device and directory
open
open/create a file using flags
close
close a file
read
read from a file
write
write to a file
mkdir
make a directory
rmdir
remove directory
stat
get file information
fstat
get file information
link
create a link to a file
unlink
remove a link to a file
lseek
goto a specific offset in a file
umount
unmount a file system
chmod
change mode of a file relative to directory file descriptor
sync
schedule file system updates
getdirentries
get directory entries in a filesystem independent format

Typical operation for the file server involves several steps common in various operating system environments including Linux. There is no difference with the various media choices.

  1. Create a file server first so that commands can be carried out for the selected media. Use pthread_create to do this.
  2. Register the file server so that it can be found as a server in the system.
  3. Make a file system using mkfs. This creates a root directory structure on the media (formatting media, all content will be deleted).
  4. Mount the file system. Note that an extra directory or a root directory is specified in addition to the registered file server name.
  5. The file system is now ready to use with the remaining file system commands.

    Compile Options

    The following compile options are for the Nand Flash File Server. The driver has the second set of options.

    FSYSDEBUGEnable overall debug logging with xprintf.DEBUGFSYSEnable deep structure debug logging with xprintf.MOUNTDEBUGEnable Mount debug logging with xprintf.RWDEBUGEnable read write debug logging with xprintf.DEBUGGINGEnable superblock debug logging with xprintf.NOCLOCKNo clock is used so return a fake time.NAND_ECC_ENABLEEnable ECC for NAND.NAND Driver Options setup in devstrad

    DEV_TYPEDevice type, in this case DEV_NAND, DEV_SD, DEV_RAMDEV_PAGE_SIZEDevice page size. Used only for DEV_NAND type.DEV_PAGE_DATA_SIZEDevice page data size. Used only for DEV_NAND type.SPARE_PAGE_SIZESpare device page size. Used only for DEV_NAND type.DEV_NUM_PAGE_BLOCKSNumber of pages in a physical block. Used only for DEV_NAND type.DEV_NUM_BLOCKSNumber of blocks in the device. Used only for DEV_NAND type.DEV_BLOCK_ERASEErase the block. Used only for DEV_NAND type.DEV_BLOCK_CHECKVerify the block. Used only for DEV_NAND type.Run Time Options

    Initialization Options

    fsi_msgsizeThis is the size in bytes of the structure set for all standard Unison messages and initialization records.fsi_nclonesSet the number of parallel file servers. Each one is implemented as a separate thread.fsi_datalogSet the number of the file server for dynamic data logging.fsi_nbuffersNumber of buffers in buffer cache. Note that the cache can be disabled using an ioctl.fsi_maxopenSet the maximum number of open files.fsi_blocksizeSet the PAGE_DATA_SIZE for the NAND flash. The other common values are 256 for the RAM disc and 512 for the SD and uSD cards. The NAND flash requires additional information from NAND driver, see NAND Driver Options setup above.Open Options

    O_CONTIGPreallocates a specific size for the file using continuous blocks and extents.O_CREATE, O_CREATCreate the file if it does not exist except if O_EXCL is set.O_WRITE, O_WRONLYOpen for writing.O_READ, O_RDONLYOpen for reading.O_DIRECTDo not use buffer cache and use DMA hardware to write directly to the media. Not implemented on all systems.O_EXCLUSIVE, O_EXCLIf this is set with O_CREATE, the creation will fail if the file exists. Useful for simple file locking.O_TRUNC, O_TRUNCATEErases the file by setting the file length to zero. Does not alter file contents or free space.O_APPEND, O_APPENDDSet the seek pointer to the end of the file prior to each writeO_UNBUFNo space to be allocated for buffered I/O.IOCTL Options for NAND Flash

    For more details, see functions description in I/O Library.

    RETURN VALUES

    In case of successful start up pthread_create will return 0 value.

    ERRORS

    In case of any errors during operation with fsys system set errno to the corresponding POSIX compatible error code.

    EACCESSearch permission is denied on a component of the path prefix, pr the file exists and the permissions specified b oflag are denied, or the file does not exist and write permission is denied for the parent directory of the file to be created, or O_TRUNC is specified and write permission is denied.EEXISTO_CREAT and O_EXCL are set and the named file exists.EINVALThe implementation does not support synchronized I/O for this file or another invalid parameter has been passed into the file server.EISDIRThe named file is a directory, and the oflag argument specifies write or read/write access.EMFILEToo many file descriptors are currently in use.EMLINIToo many file links are currently in use.ENODEVThe device is not available.ENFILEToo many files currently open in the system.ENOENTO_CREAT is not set and the named file does not exist, or O_CREAT is set and either the path prefix does not exist or the path argument points to an empty string.ENOMEMInsufficient memory exists to complete the request.ENOTDIRA component of the path prefix is not a directory.EROFSThe named file resides on a read-only file system and either O_WRONLY, O_RDWR, O_CREAT (if the file does not exist), or O_TRUNC is set in oflag argument.EIOA physical I/O error occured.EPERMInsufficient ownership for the file operation.ENOTEMPTYThe file or directory is not empty and the operation cannot be completed.ENOTSUPPORTEDThe fatfs file system does not support this operation.EBUSYThe file system is busy and cannot complete the operation.ENODEVNo such device.EFAULTFile system error.EBADFBad file operation.EBADFSYSFile system is corrupted.

    EXAMPLE

    struct fsysinit {
            uint_16 fsi_msgsize;
            uint_16 fsi_nclones;    /* Number of servers to create. */
            uint_32 fsi_datalog;    /* datlog bit definition */
            uint_16 fsi_nbuffers;   /* Number of buffers in buffer cache, minimum 2*/
            uint_16 fsi_blocksize;  /* Memory block size: 256 for NAND Flash, 512 for sd/mmc-card */
            uint_16 fsi_maxopen;    /* Max number of open files */
            uint_16 fsi_ndrives;    /* Maximum number of allocated disks, valid for FATFS only*/
    };
    
    ...
    
            /*
             *   FSYS Initialization
             */
    
            /* create the File server and mount the ram disk */
            fsysinit.fsi_msgsize = sizeof(struct fsysinit);
            fsysinit.fsi_nclones = 1;
            fsysinit.fsi_datalog = 0x3;     
            fsysinit.fsi_nbuffers = 4; /* num of disk buffers (cache size) */
            fsysinit.fsi_maxopen = 2; /* max num of open files */
            fsysinit.fsi_blocksize = PAGE_DATA_SIZE;
    
            // set up stack size and priority for main fsys threads and all clones
            pthread_attr_init(&attr);
            pthread_attr_setstacksize(&attr, FSYSSTACKSIZE);
            myNewFsysPriority.sched_priority = FSYSPRIO;
            pthread_attr_setschedparam(&attr, &myNewFsysPriority);
    
            if(!pthread_create(&tid, &attr, (void*(*)(void*))_nand_file_server, (char*)&fsysinit))
            {
                    if(!dir_register(FSYS_DIRECTORY, tid, TYPE_SERVER))
                    {
                            xprintf("..Unable to register name of Nand File Server..\n");
                            xprintf("..Required resource not present - aborting..\n");
    #if RTOS_DEBUG
                            dir_deregister("Main thread");
    #endif
                            pthread_exit((void*)1);
                    }
            }
                    
            else
            {
                    xprintf("..Unable to create File Server..\n");
                    xprintf("..Required resource for program not present - aborting..\n");
    #if RTOS_DEBUG
                    dir_deregister("Main thread");
    #endif
                    pthread_exit((void*)1);
            }
    
            xprintf(".. Nand Fsys File server is now created..\n");
            xprintf("..Attempting to mkfs and mount it...\n");
    
            // parameters found in main.h
            mkfs_status = mkfs(FSYS_DIRECTORY, NAND_DEVICE_NO,  0, NAND_DISK_MAX_FILES);
            if(mkfs_status == -1)
            {
                    xprintf("..Unable to make a file system. errno=%d\n", errno);
                    xprintf("..Please fix me\n");
    #if RTOS_DEBUG
                    dir_deregister("Main thread");
    #endif
                    pthread_exit((void*)1);
            }
    
            // must mount a directory for each mount point, here d1,
            // unique name for each
            if((mount_status = mount(NAND_DEVICE_NO, FSYS_MOUNT, 0)) == -1)
            {
                    xprintf("..Unable to mount nand flash disk. errno=%d\n", errno);
                    xprintf("..Please fix me\n");
    #if RTOS_DEBUG
                    dir_deregister("Main thread");
    #endif
                    pthread_exit((void*)1);
            }
         
    ...  
    File devstrad.c content
    ...  
    ******** NAND FLASH usage *********
    struct bdevsw bdevsw[] = {
            {(int(*)(udev_t,int,int,char*,int))nodev,  nodev,  nodev,(int(*)(udev_t,char,void*))nodev,  0}, /* zero is an invalid dev num */
            {disk_strategy, disk_open, disk_close,disk_ioctl,0}
    };
    
    ...  
    int disk_open(udev_t dev)  - will initialize the NAND flash driver
    int disk_close(udev_t dev)  - will close the NAND flash driver.
    int disk_strategy(udev_t dev, int_32 off, int len, char *buf, int rwflag)- this routine is used to read/write data from/to the NAND flash disk 
    int disk_ioctl(udev_t dev, char ctrl, void *buff)- this routine is used to control NAND flash parameters and spare page operations for the NAND flash disk 
    
    
    See demo examples for more details

    SEE ALSO

    chmod(), close(), lseek(),mkdir(), mkfs(), mount(), open(), read(), stat(), write(), fatfs

Suggest Edit

CONTACT US

TO GET YOUR PROJECT STARTED

TOP