[s1mp3-dev] [Swan API] STDIO module
Legolas
legolas558 at email.it
Sun Jun 18 17:39:38 CDT 2006
Bluechip ha scritto:
>I would suggest that you call it something other than "stdio"
>otherwise C coders will "#include <stdio.h>" and expect to be able to
>use C stdio functions.
>
>
FILESYSTEM? We can change whatever we want before v1.0 in my opinion, so
FILESYSTEM should be good enough (add proposals here)
>I would also highlight the fact that the Swan API is *not* C compliant.
>
>
Right.
I expect the below API - simple if compared to the other modules - to be
re-designed with the help of the experienced members of this mailing
list. I can spot enough inconsistencies in it to feel the need of a
rewrital and I would like to keep the wiki pages "fresh" as potential
new members do read them before joining. We are also working on the
mailing list to properly update the Dev:Swan API wiki page with the LCD
API discussion thread.
>BC
>
>At 22:53 18/06/2006, you wrote:
>
>
>>This section is online at
>>http://www.s1mp3.org/wiki/index.php/S1SDK_API_design#STDIO and will be
>>edited considering the results of the ongoing discussion
>>
>>Please comment this (awful) API spec!
>>
>>-------------------
>>
>>
>> STDIO
>>
>>Previous names assigned to this module: /FS/, /FILESYSTEM/
>>
>>Module : STDIO
>>Purpose : provides functions to handle standard I/O, i.e. files on
>>the main NAND or virtual files
>>Modules
>>used : NAND, possibly other devices' modules mapped as streams/DMA
>>
>>A file descriptor will be a struct (with child unions) which defines
>>custom data depending on the file type (filesystem file, DMA dump,
>>directories etc). File descriptors are supposed to be hold on a fixed
>>size array stored somewhere on the ZRAM. The execution of a new program
>>flags each file descriptor slot as available, allowing all the slots to
>>be reused. Basically, file descriptors do not need an explicit close()
>>since there are no cache buffers and all data is always flushed, but
>>closing a fd allows its re-use during the application execution.
>>
>>The first fd slots will be reserved and will contain descriptors for
>>core virtual files (I2C, NAND, DMA, STDIN,STDOUT,STDERR,etc.). Those
>>files will be like if always open but through open_dev() they will be
>>reinitialized if needed.
>>
>>The mode parameter will be expressed in the C standard way through a
>>small null terminated string like /"rb"/. An alternative /open()/ style
>>function will be available too (with predefined constant that can be
>>used with OR, like /O_READ|O_WRITE|O_APPEND|O_CREATE|O_BINARY/).
>>
>>A negative result is considered an error.
>>
>>//a file descriptor will be the index of the file in the global
>>fd_slot[] table
>>#define file i8
>>//the real maximum would be 255, but we have to optimize...
>>#define MAX_FD_SLOTS 64
>>
>> * file *open_dev(i8 id, i8 mode)* - basic function used to open
>> special devices as streams, like NAND (in dump mode), i2c, lineIn
>> and so on...returns a file descriptor compatible with all the
>> below functions.
>>
>> * void *close(file fd)* - closes a file stream and releases the
>> internal file descriptor
>>
>>void close(file fd) {
>> if (fd >= MAX_FD_SLOTS) {
>> //eventually set error code to: invalid file
>> return;
>> }
>> if (!fd_slot[fd].__available) {
>> //eventually set error code to: file was not open
>> return;
>> }
>> fd_slot[fd].__available = true; // there is no need to free anything
>>}
>>
>> * file *fopen(char *path, char *mode)* - basic function used to open
>> a file given the filename
>>
>> * i8 *seek(file fd,i32 offset, ui8 whence)* - used to move the file
>> pointer. Not all streams maybe seekable. /whence/ will be
>> [SEEK_SET|SEEK_CUR|SEEK_END]
>>
>> * i16 *read*(file fd, const void *buffer, ui16 nobytes) - used to
>> read data, returns actually read byte count
>>
>> i16 read(file fd, const void *buffer, ui16 nobytes) {
>> ui16 retval;
>> // as always, check the validity of 'fd'
>> switch (fd_slot[fd].__type) {
>> case FT_I2C:
>> retval = i2c_read(...);
>> break;
>> case FT_FILE:
>> ...
>> break;
>> case ...
>> default:
>> return -1;
>> }
>> return retval;
>> }
>>
>>
>> * i16 *write(file fd, void *buffer, ui16 nobytes)* - used to write
>> data, returns actually written bytes count
>>
>> * i32 *tell(file fd)* - used to get the file pointer position. Not
>> available in non-seekable files
>>
>> * ui32 *size(file fd)* - returns the current file size, with error
>> checking
>>
>> ui32 size(file fd) {
>> // check for 'fd' validity, as in open_dev()
>> return fd_slot[fd].__size;
>> }
>>
>> * void *rewind(file fd)* - returns to the start of the file, defined as
>>
>> #define rewind(fd) seek(fd, 0, SEEK_SET)
>>
>> * bool *unlink(char *path)* - deletes a physical file from the NAND,
>> accepts the filename as parameter
>>
>>// the 'type' identifier for the file descriptor
>>// will allow directory type
>>#define dir file
>>
>> * dir opendir(char *path)
>> * i8 readdir(dir handle, char *buff, u8 no)
>>
>>Reads the next file in the directory and stores it in buff, for a
>>maximum of no characters. Returns stored characters or -1 on error
>>
>> * i8 closedir(dir handle)
>>
>>-------------------
>>
>>--
>> Legolas
>>
>>
>>_______________________________________________
>>s1mp3-dev mailing list
>>s1mp3-dev at s1mp3.org
>>http://s1mp3.org/mailman/listinfo/s1mp3-dev_s1mp3.org
>>
>>
>
>
>_______________________________________________
>s1mp3-dev mailing list
>s1mp3-dev at s1mp3.org
>http://s1mp3.org/mailman/listinfo/s1mp3-dev_s1mp3.org
>
>
>
More information about the s1mp3-dev
mailing list