diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -11,5 +11,16 @@ syntax: glob *.eps *.pdf *.toc +*.map +*.sty +*.3 +*.js +*.aux +*.idx +*doc* +*Doc* +*vhdlsyn.txt +*.orig +*.o *~ diff --git a/.vhd b/.vhd new file mode 100644 --- /dev/null +++ b/.vhd @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- +------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +------------------------------------------------------------------------------- diff --git a/LPP_drivers/Doxyfile b/LPP_drivers/Doxyfile --- a/LPP_drivers/Doxyfile +++ b/LPP_drivers/Doxyfile @@ -590,7 +590,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = ./ +INPUT = ./libsrc # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -643,7 +643,7 @@ FILE_PATTERNS = *.c \ # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a diff --git a/LPP_drivers/apb_lcd/apb_lcd_driver.c b/LPP_drivers/apb_lcd/apb_lcd_driver.c deleted file mode 100644 --- a/LPP_drivers/apb_lcd/apb_lcd_driver.c +++ /dev/null @@ -1,115 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -#include "apb_lcd_driver.h" -#include "lpp_apb_functions.h" -#include "lpp_apb_functions.h" -#include - -int lcdbusy(lcd_device* lcd) -{ - return (!(lcd->cfg_reg&readyFlag)==readyFlag); -} - - -lcd_device* lcdopen(int count) -{ - lcd_device* dev; - dev = (lcd_device*) apbgetdevice(LPP_LCD_CTRLR,VENDOR_LPP,count); - return dev; - //* scan APB bus an return the count(th) lcd controler */ - -} - - - -lcd_err lcdsendcmd(lcd_device* lcd,int cmd) -{ - lcd_err err; - err = lcd_error_no_error; - if (lcd!=NULL) - { - while(lcdbusy(lcd)); - lcd->cfg_reg = cmd; - return err; - } - else - { - err = lcd_error_not_openned ; - return err; - } -} - - - -lcd_err lcdsetchar(lcd_device* lcd,int position,const char value) -{ - lcd_err err; - err = lcd_error_no_error; - return err; -} - - - -lcd_err lcdprint(lcd_device* lcd,int position,const char* value) -{ - lcd_err err; - err = lcd_error_no_error; - if (lcd!=NULL) - { - int i = position; - int n = 0; - while(value[n]!= '\0' && iFrame_buff[i++] = value[n++]; - } - return err; - } - else - { - err = lcd_error_not_openned ; - return err; - } -} - - - -lcd_err lcdclear(lcd_device* lcd) -{ - lcd_err err; - err = lcd_error_no_error; - if (lcd!=NULL) - { - int i=0; - for(i=0;iFrame_buff[i] = ' '; - } - return err; - } - err = lcd_error_not_openned ; - return err; -} - - - - diff --git a/LPP_drivers/apb_lcd/apb_lcd_driver.h b/LPP_drivers/apb_lcd/apb_lcd_driver.h deleted file mode 100644 --- a/LPP_drivers/apb_lcd/apb_lcd_driver.h +++ /dev/null @@ -1,95 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -#ifndef APB_LCD_DRIVER_H -#define APB_LCD_DRIVER_H - -#define readyFlag 1024 -#define lcdCharCnt 80 - - -/** @todo implemente some shift functions */ - - -/*=================================================== - T Y P E S D E F -====================================================*/ - - - -/** error type used for most of lcd functions */ -typedef int lcd_err; - -/** lcd error ennum for higher abstraction level when error decoding */ - enum lcd_error -{ - lcd_error_no_error, /**< no error append while function execution */ - lcd_error_not_ready, /**< the lcd isn't available*/ - lcd_error_not_openned, /**< the device guiven to the function isn't opened*/ - lcd_error_too_long /**< the string guiven to the lcd is bigger than the lcd frame buffer memory */ -}; - - -/** for each command sended to the lcd driver a time should be guiven according to the lcd datasheet */ - enum lcd_CMD_time -{ - lcd_4us = 0x0FF, - lcd_100us = 0x1FF, - lcd_4ms = 0x2FF, - lcd_20ms = 0x3FF -}; - -/** list of availiable lcd commands use whith an AND mask whith cmd time */ - enum lcd_CMD -{ - CursorON = 0xF0E, - CursorOFF = 0xF0C -}; - -/** structure representing the lcd registers */ -struct lcd_driver -{ - int cfg_reg; /**< Configuration register composed of Ready flag [10], CMD time Value [9:8], CMD to send [7:0]*/ - int Frame_buff[lcdCharCnt]; /**< Frame Buffer space each address corresponds to a char on the lcd screen */ -}; - -typedef struct lcd_driver lcd_device; - -/*=================================================== - F U N C T I O N S -====================================================*/ - -/** says if the lcd is busy */ -int lcdbusy(lcd_device * lcd); - -/** Opens and returns the counth lcd found on APB bus else NULL */ -lcd_device* lcdopen(int count); - -/** Sends a command to the given device, don't forget to guive the time of the cmd */ -lcd_err lcdsendcmd(lcd_device* lcd,int cmd); - -/** Sets a char on the given device at given position */ -lcd_err lcdsetchar(lcd_device* lcd,int position,const char value); - -/** Prints a message on the given device at given position, "\n" is understood but for others use sprintf before */ -lcd_err lcdprint(lcd_device* lcd,int position,const char* value); - -/** Writes space character on each adress of the lcd screen */ -lcd_err lcdclear(lcd_device* lcd); - -#endif diff --git a/LPP_drivers/examples/main.c b/LPP_drivers/examples/main.c deleted file mode 100644 --- a/LPP_drivers/examples/main.c +++ /dev/null @@ -1,76 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -#include "stdio.h" -#include "lpp_apb_functions.h" -#include "apb_lcd_driver.h" - - -int main() -{ - lcd_device* lcd0; - struct apbdevinfo lcd0info; - lcd0 = lcdopen(0); - char message[lcdCharCnt+1]; - if(lcd0!= NULL) - { - apbgetdeviceinfofromid(LPP_LCD_CTRLR,VENDOR_LPP,0,&lcd0info); - printf("find lcd device @ %8x\n",(int)lcd0); - apbprintdeviceinfo(lcd0info); - } - - printf("hello\n"); - lcdclear(lcd0); - int d=0; - while(d!=10) - { - scanf("%d",&d); - switch(d) - { - case 0: - lcdsendcmd(lcd0,CursorOFF&lcd_100us); - printf("cursor OFF \n"); - sprintf(message,"cursor OFF %d",d); - lcdprint(lcd0,0,message); - break; - case 1: - lcdsendcmd(lcd0,CursorON&lcd_100us); - printf("cursor ON \n"); - sprintf(message,"cursor ON %d ",d); - lcdprint(lcd0,0,message); - break; - case 2: - sprintf(message,"Test line 2_%d\nline2",d); - lcdprint(lcd0,0,message); - break; - case 3: - apbprintdeviceslist(); - break; - case 10: - sprintf(message,"QUIT %d ",d); - lcdprint(lcd0,0,message); - return 0; - break; - default: - sprintf(message,"Not a CMD %d ",d); - lcdprint(lcd0,0,message); - break; - } - } - return 0; -} diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/Doxyfile b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/Doxyfile new file mode 100644 --- /dev/null +++ b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/Doxyfile @@ -0,0 +1,1661 @@ +# Doxyfile 1.7.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "apb lcd driver" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.1 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./Doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ./ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = YES + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = YES + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans.ttf + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Debug/driver_APB_lcd_ctrlr b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Debug/driver_APB_lcd_ctrlr new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..032df9b76fea8a1279985e6135ef45ddb4344f0c GIT binary patch literal 169611 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

NFVvAkCjXHNU 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%0DRQckUnb_2h0>9?l(;^El`KPuOEKUH+fvg}uMf zrO$aYFkX_Ed_I|XTD`oR7pa%u^Uf6if@y!=#r5<%?=QqZ!TD*>+Yzfh=!f%YJ}j^1 zK|bDhi@RR)J_UJ4_6^$u^KjmJ^vmx4%me*Y=zKcH`H*+l!XET6J~NYp9yDubsYBBzlPoTd>`yzk|)gn^N+8$ALqX*p&ms49*?o_=0iW+OY)M>8}paR zdUE`Hu`f6d`glXw<)8VmPoG$5wSNWdm!sBrKtBh5ZpA+(>t*(9{+;#q$$YHOO^A7J z;r8!KsJDaPT3Pgvb#_L*ZwZZTWXKxb^B#l|C&3$ z_8j!tGgf`l2Ya3NU%|IA|EzCezAslU>Fbv-bB8jt^DnwMnM7=DUF@87$#X9}d&4=&)#sdd{zjej_BBraKu3T-@mI}dJA%l}mXa82 zPr8uIR!ikdGCjCMWzvO0vUygi=e@a1wIif@^{qkK!T$c8ro5dn?n9g7-Za_l*+srP zE19h5Cn!}B!H8+maup1hp8M#{??4jWho~+e#BTIch28;u)4r-yvxrJeqrsxa z7|9^EPG3PT&{I+R8=jS16{XCbtmdIIGeI>Fh)^%Rg~3YS%euj+f3RTg#@wFXsr1cZ z$!aN?&2P(Rb83seVT^7WSA6eSp|CUAli#AFbb}aSta~M2+)~I9(vv`iL7h zLrHFlLa8*M8lv*M9uyf>>q8yEm|EZ25$say!yTbc{eMuW#0Z;o!YCQh=@Fe`{_oT& zx>hhq|92@KNiw-TU(A-aCrjAY-a={n_>^R2Th&b+EM^-EI!RnouQ_K{8snx+zI?f% zxw@hqg>+9){~w||Yq?A|U!f0;A=)&NJLL?k2oGieMU%NAm2Q%x`UiT8r3%UF<8Bh%kw>d(t3C8bYpEE$=j~k55<0%)lTuqLLukEXXHUO^Srk ztS9-ELV8;@nllMn@ zLavUVS3fq2WWknTKoeTEoE{(Z?JdSE|W|$8yU%wM^4uvRBpbggh8frkXSi`Ze@} z?J%W(FWT!J(bmwqB5nMS}9V{2+6$aFk#X>}6ik}{_Igiwd zO7dvYV#grq53_ypz66ytL_>QtUa(@@s~Ar_tb*W@v1)}g0rX&^a}&MHkagCu#~$5^RU5A7>GQ>?f@{U|eLMUzTaddkFK$)X5< z`tWG-!gJ13{Epwzn@LwQ zedf7?^58(VDHGJum@`XyR{)JQhf-v!^RDVDSWyW>Ha*nMR zs$i@JG)-JqV!6Zn1nWU>RZ}MA&FjyQjL~dPDFh~{;7&%bml>|TX4rh zM4MVr4LYy+n&}F}Gx{lcnqQ`n&i9)q+hDC0D~T8B@ky0vN8|GF0-XepGcfY)L>wm!eFS0=-0Ys zptLJY$DCkeQK$59swO4OV+#i{Kzeu{xzzsx+Kx6m5VilZwxX z@Yq3*o-|YWOmpt^K|RE2bUahd?08GmRZCS!D=p~;3j=je{y1;Op&96fQ}509_U3by zWHhXd#O39u)psp&96r;O(C>)7CPsN>u%}XM%4G_*RA#1i%{mXewVLGU@+Y*Om3K&t0W_ecQc%5t-b%oR0R5!-Hay4ts1 zvz5G@!HB|M#WC{&0Ge7)C<~oWCt}CYQyn^L%$H{U87ggl60?<#JgnNB)(!u=3~Ze+ zAhC;D6OXUu>KEsjZdAxb@{WGN^_uLHuEOtg6~1#+5=*V=sYkg6g)#in+3ZB3+%#9# zpDPz}z*f#gXE+iKa_)1=Fn<}nsT`BC$+9?xc7;V!9SKv>N?)mvWl|SSmF%Zi*O@^j zv2K-osc0(%XyP0ZwVA?rHO`g~mN8RM9X)1-M(?YnA+%$z&`W4S>~w()SzEk?K&@DP zcQDM+W{HlmGMfL5AneT(!SI9MAkMdMqp!|um9eIf#`&j07O`vdI@UZz%&|u&H&gC> kl4>>*AzdT2qyswl_2ql3B$KgkIYTu#$mqEHCNcH@0WfF9RsaA1 diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Release/driver_APB_lcd_ctrlr b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Release/driver_APB_lcd_ctrlr new file mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..aacee37144202b53b32b16a05b1089130fea6d35 GIT binary patch literal 126064 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 z z6TAc;!B3D06@*Gc6+t1?5*i6D1eMT9h!A=S8lj&sKsZH+5{3yQgi%6_FhQ6kOzF79 z2u^}T$RTiom*6A#2{NIAP)VpFD1=%6TAq$4H);wH6x!n&-edbK$?vp=CadwNx+Dg!MK;f z=$GNv8f<&_jffMODDE#SThG1sZ+-M`zNV<8sASP((PYtN(PYu&vo|Sfu5AuCg@fBz zQMjfh%!)$6aF7*kYi?#m->Pn6Mb!;Ech=O0Z>>wf*#K<#6J$mzcF||Dcaoe&wl*2< zEl896uXE64lN#tQ4=~H+6O7q&OmsAZ%I>&9_wKMx$LuCLL!HM=b3Q;fz?j1vuEiwV OZkYaYC45)J)BP`|x{W9R diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Release/load.txt b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Release/load.txt new file mode 100644 --- /dev/null +++ b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/bin/Release/load.txt @@ -0,0 +1,1 @@ +load driver_APB_lcd_ctrlr diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.cbp b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.cbp new file mode 100644 --- /dev/null +++ b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.cbp @@ -0,0 +1,42 @@ + + + + + + diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.depend b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.depend new file mode 100644 --- /dev/null +++ b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.depend @@ -0,0 +1,25 @@ +# depslib dependency file v1.0 +1290187550 source:/home/alexis/Prog/Leon3/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/main.c + "stdio.h" + "lpp_apb_functions.h" + "apb_lcd_driver.h" + +1290183144 /home/alexis/Prog/Leon3/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/apb_lcd_driver.h + +1290183058 source:/home/alexis/Prog/Leon3/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/apb_lcd_driver.c + "apb_lcd_driver.h" + "lpp_apb_functions.h" + "lpp_apb_functions.h" + + +1290413299 /home/alexis/Prog/Leon3/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/lpp_apb_functions.h + +1290416373 source:/home/alexis/Prog/Leon3/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/lpp_apb_functions.c + "lpp_apb_functions.h" + + +1291013871 source:/home/alexis/Prog/Leon3/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/main.c + "stdio.h" + "lpp_apb_functions.h" + "apb_lcd_driver.h" + diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.layout b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.layout new file mode 100644 --- /dev/null +++ b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/driver_APB_lcd_ctrlr.layout @@ -0,0 +1,7 @@ + + + + + + + diff --git a/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/main.c b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/main.c new file mode 100644 --- /dev/null +++ b/LPP_drivers/exemples/APB_lcd_ctrlr/driver_APB_lcd_ctrlr/main.c @@ -0,0 +1,59 @@ +#include "stdio.h" +#include "lpp_apb_functions.h" +#include "apb_lcd_driver.h" + + + +int main() +{ + lcd_device* lcd0; + struct apbdevinfo lcd0info; + lcd0 = lcdopen(0); + char message[lcdCharCnt+1]; + if(lcd0!= NULL) + { + apbgetdeviceinfofromid(LPP_LCD_CTRLR,VENDOR_LPP,0,&lcd0info); + printf("find lcd device @ %8x\n",(int)lcd0); + apbprintdeviceinfo(lcd0info); + } + + printf("hello\n"); + lcdclear(lcd0); + int d=0; + while(d!=10) + { + scanf("%d",&d); + switch(d) + { + case 0: + lcdsendcmd(lcd0,CursorOFF&lcd_100us); + printf("cursor OFF \n"); + sprintf(message,"cursor OFF %d",d); + lcdprint(lcd0,0,message); + break; + case 1: + lcdsendcmd(lcd0,CursorON&lcd_100us); + printf("cursor ON \n"); + sprintf(message,"cursor ON %d ",d); + lcdprint(lcd0,0,message); + break; + case 2: + sprintf(message,"Test line 2_%d\nline2",d); + lcdprint(lcd0,0,message); + break; + case 3: + apbprintdeviceslist(); + break; + case 10: + sprintf(message,"QUIT %d ",d); + lcdprint(lcd0,0,message); + return 0; + break; + default: + sprintf(message,"Not a CMD %d ",d); + lcdprint(lcd0,0,message); + break; + } + } + return 0; +} diff --git a/LPP_drivers/includes/apb_lcd_driver.h b/LPP_drivers/includes/apb_lcd_driver.h new file mode 100644 --- /dev/null +++ b/LPP_drivers/includes/apb_lcd_driver.h @@ -0,0 +1,95 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +#ifndef APB_LCD_DRIVER_H +#define APB_LCD_DRIVER_H + +#define readyFlag 1024 +#define lcdCharCnt 80 + + +/** @todo implemente some shift functions */ + + +/*=================================================== + T Y P E S D E F +====================================================*/ + + + +/** error type used for most of lcd functions */ +typedef int lcd_err; + +/** lcd error ennum for higher abstraction level when error decoding */ + enum lcd_error +{ + lcd_error_no_error, /**< no error append while function execution */ + lcd_error_not_ready, /**< the lcd isn't available*/ + lcd_error_not_openned, /**< the device guiven to the function isn't opened*/ + lcd_error_too_long /**< the string guiven to the lcd is bigger than the lcd frame buffer memory */ +}; + + +/** for each command sended to the lcd driver a time should be guiven according to the lcd datasheet */ + enum lcd_CMD_time +{ + lcd_4us = 0x0FF, + lcd_100us = 0x1FF, + lcd_4ms = 0x2FF, + lcd_20ms = 0x3FF +}; + +/** list of availiable lcd commands use whith an AND mask whith cmd time */ + enum lcd_CMD +{ + CursorON = 0xF0E, + CursorOFF = 0xF0C +}; + +/** structure representing the lcd registers */ +struct lcd_driver +{ + int cfg_reg; /**< Configuration register composed of Ready flag [10], CMD time Value [9:8], CMD to send [7:0]*/ + int Frame_buff[lcdCharCnt]; /**< Frame Buffer space each address corresponds to a char on the lcd screen */ +}; + +typedef struct lcd_driver lcd_device; + +/*=================================================== + F U N C T I O N S +====================================================*/ + +/** says if the lcd is busy */ +int lcdbusy(lcd_device * lcd); + +/** Opens and returns the counth lcd found on APB bus else NULL */ +lcd_device* lcdopen(int count); + +/** Sends a command to the given device, don't forget to guive the time of the cmd */ +lcd_err lcdsendcmd(lcd_device* lcd,int cmd); + +/** Sets a char on the given device at given position */ +lcd_err lcdsetchar(lcd_device* lcd,int position,const char value); + +/** Prints a message on the given device at given position, "\n" is understood but for others use sprintf before */ +lcd_err lcdprint(lcd_device* lcd,int position,const char* value); + +/** Writes space character on each adress of the lcd screen */ +lcd_err lcdclear(lcd_device* lcd); + +#endif diff --git a/LPP_drivers/includes/lpp_apb_functions.h b/LPP_drivers/includes/lpp_apb_functions.h new file mode 100644 --- /dev/null +++ b/LPP_drivers/includes/lpp_apb_functions.h @@ -0,0 +1,65 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +#ifndef LPP_APB_FUNCTIONS_H +#define LPP_APB_FUNCTIONS_H + +#define APB_TBL_HEAD 0x800FF000 +#define APB_BASE_ADDRS 0x80000000 +#define APB_MAX_DEVICES 256 + +#define VENDOR_LPP 0x19 + +#define ROCKET_TM 0x001 +#define otherCore 0x002 +#define LPP_SIMPLE_DIODE 0x003 +#define LPP_MULTI_DIODE 0x004 +#define LPP_LCD_CTRLR 0x005 + +/** @todo implemente a descriptor structure for any APB device */ + + +/** Structure representing a device descriptor register on Grlib's AHB2APB brige with plug and play feature */ +struct apbPnPreg +{ + int idReg; /**< id register composed of Vendor ID [31:24], Device ID [23:12], CT [11:10], Version [9:5], IRQ [4:0] */ + int bar; /**< Bank Address Register composed of Device's ADDRESS [31:20], MASK [14:4], TYPE [3:0] */ +}; + +struct apbdevinfo +{ + int vendorID; + int productID; + int version; + int irq; + int address; + int mask; +}; + +/** This Function scans APB devices table and returns counth device according to VID and PID */ +int* apbgetdevice(int PID,int VID,int count); +/** This Function scans APB devices table and returns counth device informations according VID and PID */ +void apbgetdeviceinfofromid(int PID,int VID,int count,struct apbdevinfo* devinfo); + +void apbgetdeviceinfofromdevptr(const struct apbPnPreg* dev,struct apbdevinfo* devinfo); + + +void apbprintdeviceinfo(struct apbdevinfo devinfo); + +void apbprintdeviceslist(); +#endif // LPP_APB_FUNCTIONS_H diff --git a/LPP_drivers/lib/libapb_lcd_driver.a b/LPP_drivers/lib/libapb_lcd_driver.a new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..923b4eb5c43f1bdea78297759159c8ceee46b5ab GIT binary patch literal 1758 zc$}40!E4iC6n{zEq$>)s46K`jDA;x&X}gut4Uxh+*F%{n@wm2Wu!D9RZ5$2;cHPB; zhan!k2s!u%3=xrCGJ>GTA)a;`2+~6jQOCet=KGQ_T^c%_58iv<`@Y|M-|xL9&5b*y zhFrZHN{IcEnwU;aWYU?*j3_3p9k&(5Oxi&fLjb^`ejlVYxl(@ITnF?ktI9I*O=YafGETLpbA@{h%Ro;UU@hAd->~J~9NV;DsPw`^sy%EG@Pl(~k^ZKN^Jp8PoE6*148zX+>aL5Vmq$`E3D$^vq9U zK|lRXJjprWwfupY1ybLL>88*E&dw28gWgN_O$n* z${|nc<5~BF*9usp+vc;35zN9?ycpTa6eAQrZsTvF=x$Z6!X}3kR5xAm=i7w9|RafZiO}veRYkf=HKOu%t`T|VpZZbP8YS=sO$3#v`Q+>pYLv!48^?b3+~>TPw^4%^ zz@?z?UAA!H0k|t?wJh8LnwbGO;#pUF8))_^7moHJpbqud3lz{i98k|Iy?sBN{%{}o zJUPC;`c~lg!~r<#H4?V-N5GzYlEyb3ykNToY94iio|74TM2*vU4z-KR>oi`#agg4h lTe0V_SqAU-0RfK`wW6#o$;yR47DVv(4)T<04M%OQ{{SYHha3O^ diff --git a/LPP_drivers/lib/liblpp_apb_functions.a b/LPP_drivers/lib/liblpp_apb_functions.a new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a569ad5ca06e49cfd215ff56a00052c822396db5 GIT binary patch literal 2780 zc$}?PL5Le=6n@D}oar>^xTZ9qWk+#Ml#-p@hML;04R*CDED}VEw@x;hw82d#&dln1 zYC3!A!NVdRya)jgUVB`&!jvHD!NXD(2@-HY4?XN5l^|s)#P`qqll++m7sVgufA4+o zd+&e$|NhM6#S0~~eB(`NUYQ&Vi{};=bJ^UPoT8{6!p_8hmTH;=05O0_BK(w^tJihA zqJL5=>%bbdM%AdAMjfrDZBBL7DgdM z8)ds@G^~snw|ImZep&rZ;8*3|iwfSd4^a4GHqMzr;b0`Mu zG3PLf4V}Y?%bo-FSvsQ6KM+6L-?j`%4zVp+gZn&SM*otJF@>Lk$y2cS6f7|X69X(% z%ZH>_SZ5FKVHfM}k^Rv#ewy~9i}o-v+Nay2d+QM&>ZG4t+~>o7+=fKoK1I{0te5R49LwGtRVh^}rfykdAH}bj zA0swb3DN|3y<~kfk%;0~b<@K4={QD`mi(bK^iLK4{jF4u^+tu_OEmT6OPAhI(wE=; z;8o>JCY!<6WXAfeZkJY3+NLjW1e&R@l`^)zVMC@;vP+OzwJbyp-zXdPy56wiUkrt| z;VEk4^8EXZpQrM9M#mv;_}@GbX*}`8@p*;04g|g(S}*u6oTjly@fN5aWq8{RPo(l3 zOn!6nIL%DS_w0C0kM|xR%MC-pp?Ijc~d{k;<&!cxxeopP{K|a|R4a|H2T}jXX z)mndw}Bt)qkd(B + + + +int* apbgetdevice(int PID,int VID,int count) +{ + struct apbPnPreg* dev = (struct apbPnPreg*)(APB_TBL_HEAD + sizeof(struct apbPnPreg)); + int id; + id = (PID<<12) | (VID<<24); + while(dev != (struct apbPnPreg*)(APB_TBL_HEAD|0xFFF)) + { + if((dev->idReg & 0xFFFFF000) == id) + { + if(count == 0) + { + return (int*) (APB_BASE_ADDRS | (dev->bar&0xFFF00000)>>12); + } + count-=1; + } + dev += 1; + } + return NULL; +} + + +void apbgetdeviceinfofromdevptr(const struct apbPnPreg* dev,struct apbdevinfo* devinfo) +{ + + devinfo->productID = (dev->idReg>>12) & 0xFFF; + devinfo->vendorID = (dev->idReg>>24) & 0xFF; + devinfo->address = ((dev->bar>>12) & 0xFFF00)|APB_BASE_ADDRS; + devinfo->irq = dev->idReg & 0x1F; + devinfo->mask = (dev->bar>>4)&0xFFF; + devinfo->version = (dev->idReg>>5)&0x1F; +} + +void apbgetdeviceinfofromid(int PID,int VID,int count,struct apbdevinfo* devinfo) +{ + struct apbPnPreg* dev = (struct apbPnPreg*)(APB_TBL_HEAD + sizeof(struct apbPnPreg)); + int id; + id = (PID<<12) | (VID<<24); + while(dev != (struct apbPnPreg*)(APB_TBL_HEAD|0xFFF)) + { + if((dev->idReg & 0xFFFFF000) == id) + { + if(count == 0) + { + devinfo->productID = PID; + devinfo->vendorID = VID; + devinfo->address = ((dev->bar>>12) & 0xFFF00)|APB_BASE_ADDRS; + devinfo->irq = dev->idReg & 0x1F; + devinfo->mask = (dev->bar>>4)&0xFFF; + devinfo->version = (dev->idReg>>5)&0x1F; + return; + } + count-=1; + } + dev += 1; + } +} + + + +void apbprintdeviceinfo(struct apbdevinfo devinfo) +{ + printf("Vendor ID = 0x%x\n",devinfo.vendorID); + printf("Product ID = 0x%x\n",devinfo.productID); + printf("Device address = 0x%x\n",devinfo.address); + printf("Device Irq = %d\n",devinfo.irq); + printf("Device mask = 0x%x\n",devinfo.mask); + printf("Device Version = %d\n",devinfo.version); +} + + +void apbprintdeviceslist() +{ + struct apbdevinfo devinfo; + struct apbPnPreg* dev = (struct apbPnPreg*)(APB_TBL_HEAD );//+ sizeof(struct apbPnPreg)); + int i =0; + int fisrtBAR; + while((dev->idReg == 0) && (ibar; + for(i=i;iidReg != 0 )) + { + apbgetdeviceinfofromdevptr(dev,&devinfo); + printf("\n\n======= new device found========\n"); + apbprintdeviceinfo(devinfo); + } + dev += 1; + if(dev->bar == fisrtBAR) + break; + } +} + diff --git a/LPP_drivers/libsrc/AMBA/lpp_apb_functions.h b/LPP_drivers/libsrc/AMBA/lpp_apb_functions.h new file mode 100644 --- /dev/null +++ b/LPP_drivers/libsrc/AMBA/lpp_apb_functions.h @@ -0,0 +1,65 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +#ifndef LPP_APB_FUNCTIONS_H +#define LPP_APB_FUNCTIONS_H + +#define APB_TBL_HEAD 0x800FF000 +#define APB_BASE_ADDRS 0x80000000 +#define APB_MAX_DEVICES 256 + +#define VENDOR_LPP 0x19 + +#define ROCKET_TM 0x001 +#define otherCore 0x002 +#define LPP_SIMPLE_DIODE 0x003 +#define LPP_MULTI_DIODE 0x004 +#define LPP_LCD_CTRLR 0x005 + +/** @todo implemente a descriptor structure for any APB device */ + + +/** Structure representing a device descriptor register on Grlib's AHB2APB brige with plug and play feature */ +struct apbPnPreg +{ + int idReg; /**< id register composed of Vendor ID [31:24], Device ID [23:12], CT [11:10], Version [9:5], IRQ [4:0] */ + int bar; /**< Bank Address Register composed of Device's ADDRESS [31:20], MASK [14:4], TYPE [3:0] */ +}; + +struct apbdevinfo +{ + int vendorID; + int productID; + int version; + int irq; + int address; + int mask; +}; + +/** This Function scans APB devices table and returns counth device according to VID and PID */ +int* apbgetdevice(int PID,int VID,int count); +/** This Function scans APB devices table and returns counth device informations according VID and PID */ +void apbgetdeviceinfofromid(int PID,int VID,int count,struct apbdevinfo* devinfo); + +void apbgetdeviceinfofromdevptr(const struct apbPnPreg* dev,struct apbdevinfo* devinfo); + + +void apbprintdeviceinfo(struct apbdevinfo devinfo); + +void apbprintdeviceslist(); +#endif // LPP_APB_FUNCTIONS_H diff --git a/LPP_drivers/libsrc/LCD/Makefile b/LPP_drivers/libsrc/LCD/Makefile new file mode 100644 --- /dev/null +++ b/LPP_drivers/libsrc/LCD/Makefile @@ -0,0 +1,25 @@ +#------------------------------------------------------------------------------ +#-- This file is a part of the LPP VHDL IP LIBRARY +#-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +#-- +#-- This program is free software; you can redistribute it and/or modify +#-- it under the terms of the GNU General Public License as published by +#-- the Free Software Foundation; either version 3 of the License, or +#-- (at your option) any later version. +#-- +#-- This program is distributed in the hope that it will be useful, +#-- but WITHOUT ANY WARRANTY; without even the implied warranty of +#-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#-- GNU General Public License for more details. +#-- +#-- You should have received a copy of the GNU General Public License +#-- along with this program; if not, write to the Free Software +#-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#------------------------------------------------------------------------------ +FILE = apb_lcd_driver +LIB = liblpp_lcd_driver.a + +include ../../rules.mk + +all: $(FILE).a + @echo $(FILE)".a created" diff --git a/LPP_drivers/libsrc/LCD/apb_lcd_driver.c b/LPP_drivers/libsrc/LCD/apb_lcd_driver.c new file mode 100644 --- /dev/null +++ b/LPP_drivers/libsrc/LCD/apb_lcd_driver.c @@ -0,0 +1,115 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +#include "apb_lcd_driver.h" +#include "lpp_apb_functions.h" +#include "lpp_apb_functions.h" +#include + +int lcdbusy(lcd_device* lcd) +{ + return (!(lcd->cfg_reg&readyFlag)==readyFlag); +} + + +lcd_device* lcdopen(int count) +{ + lcd_device* dev; + dev = (lcd_device*) apbgetdevice(LPP_LCD_CTRLR,VENDOR_LPP,count); + return dev; + //* scan APB bus an return the count(th) lcd controler */ + +} + + + +lcd_err lcdsendcmd(lcd_device* lcd,int cmd) +{ + lcd_err err; + err = lcd_error_no_error; + if (lcd!=NULL) + { + while(lcdbusy(lcd)); + lcd->cfg_reg = cmd; + return err; + } + else + { + err = lcd_error_not_openned ; + return err; + } +} + + + +lcd_err lcdsetchar(lcd_device* lcd,int position,const char value) +{ + lcd_err err; + err = lcd_error_no_error; + return err; +} + + + +lcd_err lcdprint(lcd_device* lcd,int position,const char* value) +{ + lcd_err err; + err = lcd_error_no_error; + if (lcd!=NULL) + { + int i = position; + int n = 0; + while(value[n]!= '\0' && iFrame_buff[i++] = value[n++]; + } + return err; + } + else + { + err = lcd_error_not_openned ; + return err; + } +} + + + +lcd_err lcdclear(lcd_device* lcd) +{ + lcd_err err; + err = lcd_error_no_error; + if (lcd!=NULL) + { + int i=0; + for(i=0;iFrame_buff[i] = ' '; + } + return err; + } + err = lcd_error_not_openned ; + return err; +} + + + + diff --git a/LPP_drivers/libsrc/LCD/apb_lcd_driver.h b/LPP_drivers/libsrc/LCD/apb_lcd_driver.h new file mode 100644 --- /dev/null +++ b/LPP_drivers/libsrc/LCD/apb_lcd_driver.h @@ -0,0 +1,95 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the LPP VHDL IP LIBRARY +-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +#ifndef APB_LCD_DRIVER_H +#define APB_LCD_DRIVER_H + +#define readyFlag 1024 +#define lcdCharCnt 80 + + +/** @todo implemente some shift functions */ + + +/*=================================================== + T Y P E S D E F +====================================================*/ + + + +/** error type used for most of lcd functions */ +typedef int lcd_err; + +/** lcd error ennum for higher abstraction level when error decoding */ + enum lcd_error +{ + lcd_error_no_error, /**< no error append while function execution */ + lcd_error_not_ready, /**< the lcd isn't available*/ + lcd_error_not_openned, /**< the device guiven to the function isn't opened*/ + lcd_error_too_long /**< the string guiven to the lcd is bigger than the lcd frame buffer memory */ +}; + + +/** for each command sended to the lcd driver a time should be guiven according to the lcd datasheet */ + enum lcd_CMD_time +{ + lcd_4us = 0x0FF, + lcd_100us = 0x1FF, + lcd_4ms = 0x2FF, + lcd_20ms = 0x3FF +}; + +/** list of availiable lcd commands use whith an AND mask whith cmd time */ + enum lcd_CMD +{ + CursorON = 0xF0E, + CursorOFF = 0xF0C +}; + +/** structure representing the lcd registers */ +struct lcd_driver +{ + int cfg_reg; /**< Configuration register composed of Ready flag [10], CMD time Value [9:8], CMD to send [7:0]*/ + int Frame_buff[lcdCharCnt]; /**< Frame Buffer space each address corresponds to a char on the lcd screen */ +}; + +typedef struct lcd_driver lcd_device; + +/*=================================================== + F U N C T I O N S +====================================================*/ + +/** says if the lcd is busy */ +int lcdbusy(lcd_device * lcd); + +/** Opens and returns the counth lcd found on APB bus else NULL */ +lcd_device* lcdopen(int count); + +/** Sends a command to the given device, don't forget to guive the time of the cmd */ +lcd_err lcdsendcmd(lcd_device* lcd,int cmd); + +/** Sets a char on the given device at given position */ +lcd_err lcdsetchar(lcd_device* lcd,int position,const char value); + +/** Prints a message on the given device at given position, "\n" is understood but for others use sprintf before */ +lcd_err lcdprint(lcd_device* lcd,int position,const char* value); + +/** Writes space character on each adress of the lcd screen */ +lcd_err lcdclear(lcd_device* lcd); + +#endif diff --git a/LPP_drivers/libsrc/Makefile b/LPP_drivers/libsrc/Makefile new file mode 100644 --- /dev/null +++ b/LPP_drivers/libsrc/Makefile @@ -0,0 +1,30 @@ +#------------------------------------------------------------------------------ +#-- This file is a part of the LPP VHDL IP LIBRARY +#-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +#-- +#-- This program is free software; you can redistribute it and/or modify +#-- it under the terms of the GNU General Public License as published by +#-- the Free Software Foundation; either version 3 of the License, or +#-- (at your option) any later version. +#-- +#-- This program is distributed in the hope that it will be useful, +#-- but WITHOUT ANY WARRANTY; without even the implied warranty of +#-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#-- GNU General Public License for more details. +#-- +#-- You should have received a copy of the GNU General Public License +#-- along with this program; if not, write to the Free Software +#-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#------------------------------------------------------------------------------ + +include ../rules.mk + + + +all: + make all -C AMBA + make all -C LCD + +cleanall: + make clean -C AMBA + make clean -C LCD diff --git a/LPP_drivers/libsrc/Makefile.inc b/LPP_drivers/libsrc/Makefile.inc new file mode 100644 --- /dev/null +++ b/LPP_drivers/libsrc/Makefile.inc @@ -0,0 +1,44 @@ +#------------------------------------------------------------------------------ +#-- This file is a part of the LPP VHDL IP LIBRARY +#-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +#-- +#-- This program is free software; you can redistribute it and/or modify +#-- it under the terms of the GNU General Public License as published by +#-- the Free Software Foundation; either version 3 of the License, or +#-- (at your option) any later version. +#-- +#-- This program is distributed in the hope that it will be useful, +#-- but WITHOUT ANY WARRANTY; without even the implied warranty of +#-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#-- GNU General Public License for more details. +#-- +#-- You should have received a copy of the GNU General Public License +#-- along with this program; if not, write to the Free Software +#-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#------------------------------------------------------------------------------ + +CC = sparc-elf-gcc +AR = sparc-elf-ar +LIBDIR = ../../lib/ +INCPATH = ../../includes/ + + +$(FILE): $(FILE).a + @echo "library ""lib"$(FILE)" created" + + +$(FILE).o: + mkdir tmp + $(CC) -c $(FILE).c -I $(INCPATH) -o tmp/$(FILE).o + +$(FILE).a: $(FILE).o + $(AR) rs $(LIBDIR)"lib"$(FILE).a tmp/$(FILE).o + cp *.h $(INCPATH) + rm -R tmp + +clean: + rm -f -R tmp + rm -f *.{o,a} + rm -f $(INCPATH)*.h + rm -f $(LIBDIR)*.{o,a} + diff --git a/LPP_drivers/lpp_apb/lpp_apb_functions.c b/LPP_drivers/lpp_apb/lpp_apb_functions.c deleted file mode 100644 --- a/LPP_drivers/lpp_apb/lpp_apb_functions.c +++ /dev/null @@ -1,119 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -#include "lpp_apb_functions.h" -#include - - - -int* apbgetdevice(int PID,int VID,int count) -{ - struct apbPnPreg* dev = (struct apbPnPreg*)(APB_TBL_HEAD + sizeof(struct apbPnPreg)); - int id; - id = (PID<<12) | (VID<<24); - while(dev != (struct apbPnPreg*)(APB_TBL_HEAD|0xFFF)) - { - if((dev->idReg & 0xFFFFF000) == id) - { - if(count == 0) - { - return (int*) (APB_BASE_ADDRS | (dev->bar&0xFFF00000)>>12); - } - count-=1; - } - dev += 1; - } - return NULL; -} - - -void apbgetdeviceinfofromdevptr(const struct apbPnPreg* dev,struct apbdevinfo* devinfo) -{ - - devinfo->productID = (dev->idReg>>12) & 0xFFF; - devinfo->vendorID = (dev->idReg>>24) & 0xFF; - devinfo->address = ((dev->bar>>12) & 0xFFF00)|APB_BASE_ADDRS; - devinfo->irq = dev->idReg & 0x1F; - devinfo->mask = (dev->bar>>4)&0xFFF; - devinfo->version = (dev->idReg>>5)&0x1F; -} - -void apbgetdeviceinfofromid(int PID,int VID,int count,struct apbdevinfo* devinfo) -{ - struct apbPnPreg* dev = (struct apbPnPreg*)(APB_TBL_HEAD + sizeof(struct apbPnPreg)); - int id; - id = (PID<<12) | (VID<<24); - while(dev != (struct apbPnPreg*)(APB_TBL_HEAD|0xFFF)) - { - if((dev->idReg & 0xFFFFF000) == id) - { - if(count == 0) - { - devinfo->productID = PID; - devinfo->vendorID = VID; - devinfo->address = ((dev->bar>>12) & 0xFFF00)|APB_BASE_ADDRS; - devinfo->irq = dev->idReg & 0x1F; - devinfo->mask = (dev->bar>>4)&0xFFF; - devinfo->version = (dev->idReg>>5)&0x1F; - return; - } - count-=1; - } - dev += 1; - } -} - - - -void apbprintdeviceinfo(struct apbdevinfo devinfo) -{ - printf("Vendor ID = 0x%x\n",devinfo.vendorID); - printf("Product ID = 0x%x\n",devinfo.productID); - printf("Device address = 0x%x\n",devinfo.address); - printf("Device Irq = %d\n",devinfo.irq); - printf("Device mask = 0x%x\n",devinfo.mask); - printf("Device Version = %d\n",devinfo.version); -} - - -void apbprintdeviceslist() -{ - struct apbdevinfo devinfo; - struct apbPnPreg* dev = (struct apbPnPreg*)(APB_TBL_HEAD );//+ sizeof(struct apbPnPreg)); - int i =0; - int fisrtBAR; - while((dev->idReg == 0) && (ibar; - for(i=i;iidReg != 0 )) - { - apbgetdeviceinfofromdevptr(dev,&devinfo); - printf("\n\n======= new device found========\n"); - apbprintdeviceinfo(devinfo); - } - dev += 1; - if(dev->bar == fisrtBAR) - break; - } -} - diff --git a/LPP_drivers/lpp_apb/lpp_apb_functions.h b/LPP_drivers/lpp_apb/lpp_apb_functions.h deleted file mode 100644 --- a/LPP_drivers/lpp_apb/lpp_apb_functions.h +++ /dev/null @@ -1,65 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the LPP VHDL IP LIBRARY --- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 3 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -#ifndef LPP_APB_FUNCTIONS_H -#define LPP_APB_FUNCTIONS_H - -#define APB_TBL_HEAD 0x800FF000 -#define APB_BASE_ADDRS 0x80000000 -#define APB_MAX_DEVICES 256 - -#define VENDOR_LPP 0x19 - -#define ROCKET_TM 0x001 -#define otherCore 0x002 -#define LPP_SIMPLE_DIODE 0x003 -#define LPP_MULTI_DIODE 0x004 -#define LPP_LCD_CTRLR 0x005 - -/** @todo implemente a descriptor structure for any APB device */ - - -/** Structure representing a device descriptor register on Grlib's AHB2APB brige with plug and play feature */ -struct apbPnPreg -{ - int idReg; /**< id register composed of Vendor ID [31:24], Device ID [23:12], CT [11:10], Version [9:5], IRQ [4:0] */ - int bar; /**< Bank Address Register composed of Device's ADDRESS [31:20], MASK [14:4], TYPE [3:0] */ -}; - -struct apbdevinfo -{ - int vendorID; - int productID; - int version; - int irq; - int address; - int mask; -}; - -/** This Function scans APB devices table and returns counth device according to VID and PID */ -int* apbgetdevice(int PID,int VID,int count); -/** This Function scans APB devices table and returns counth device informations according VID and PID */ -void apbgetdeviceinfofromid(int PID,int VID,int count,struct apbdevinfo* devinfo); - -void apbgetdeviceinfofromdevptr(const struct apbPnPreg* dev,struct apbdevinfo* devinfo); - - -void apbprintdeviceinfo(struct apbdevinfo devinfo); - -void apbprintdeviceslist(); -#endif // LPP_APB_FUNCTIONS_H diff --git a/LPP_drivers/rules.mk b/LPP_drivers/rules.mk new file mode 100644 --- /dev/null +++ b/LPP_drivers/rules.mk @@ -0,0 +1,44 @@ +#------------------------------------------------------------------------------ +#-- This file is a part of the LPP VHDL IP LIBRARY +#-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS +#-- +#-- This program is free software; you can redistribute it and/or modify +#-- it under the terms of the GNU General Public License as published by +#-- the Free Software Foundation; either version 3 of the License, or +#-- (at your option) any later version. +#-- +#-- This program is distributed in the hope that it will be useful, +#-- but WITHOUT ANY WARRANTY; without even the implied warranty of +#-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#-- GNU General Public License for more details. +#-- +#-- You should have received a copy of the GNU General Public License +#-- along with this program; if not, write to the Free Software +#-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#------------------------------------------------------------------------------ + +CC = sparc-elf-gcc +AR = sparc-elf-ar +LIBDIR = ../../lib/ +INCPATH = ../../includes/ + + +$(FILE): $(FILE).a + @echo "library ""lib"$(FILE)" created" + + +$(FILE).o: + mkdir tmp + $(CC) -c $(FILE).c -I $(INCPATH) -o tmp/$(FILE).o + +$(FILE).a: $(FILE).o + $(AR) rs $(LIBDIR)"lib"$(FILE).a tmp/$(FILE).o + cp *.h $(INCPATH) + rm -R tmp + +clean: + rm -f -R tmp + rm -f *.{o,a} + rm -f $(INCPATH)*.h + rm -f $(LIBDIR)*.{o,a} +