pur300 Posted February 3, 2015 Report Share Posted February 3, 2015 Hello,I'm currently working on a project(STM32f4) which uses a chibios and ugfx library and i have a problem reading from a file. When i use a method gfileOpen() it always returns zero(NULL). I've added all necessary define statements into a gfxconf.h config file(#define GFX_USE_OS_CHIBIOS TRUE, #define GFX_USE_GFILE TRUE, #define GFILE_NEED_FATFS TRUE and #define GFILE_NEED_NOAUTOMOUNT FALSE) and i've also enabled a SDC subsystem in a halconf.h config file(#define HAL_USE_SDC TRUE).Here is my test code:#include "gfx.h"GFILE *file;long length = -1;int main(void) { gfxInit(); file = gfileOpen("test.txt", "r"); if(file != NULL){ length = gfileGetSize(file); } while(1) { gfxSleepMilliseconds(1000); } return 0;}Here is my makefile:############################################################################### Build global options# NOTE: Can be overridden externally.## Compiler options here.ifeq ($(USE_OPT),) USE_OPT = -O2 -ggdb -fomit-frame-pointer -falign-functions=16endif# C specific options here (added to USE_OPT).ifeq ($(USE_COPT),) USE_COPT = endif# C++ specific options here (added to USE_OPT).ifeq ($(USE_CPPOPT),) USE_CPPOPT = -fno-rttiendif# Enable this if you want the linker to remove unused code and dataifeq ($(USE_LINK_GC),) USE_LINK_GC = yesendif# Linker extra options here.ifeq ($(USE_LDOPT),) USE_LDOPT = endif# Enable this if you want link time optimizations (LTO)ifeq ($(USE_LTO),) USE_LTO = noendif# If enabled, this option allows to compile the application in THUMB mode.ifeq ($(USE_THUMB),) USE_THUMB = yesendif# Enable this if you want to see the full log while compiling.ifeq ($(USE_VERBOSE_COMPILE),) USE_VERBOSE_COMPILE = noendif## Build global options############################################################################################################################################################# Architecture or project specific options## Enables the use of FPU on Cortex-M4 (no, softfp, hard).ifeq ($(USE_FPU),) USE_FPU = noendif## Architecture or project specific options############################################################################################################################################################# Project, sources and paths## Define project name herePROJECT = ch# Imported source files and pathsCHIBIOS = ../../chibiosGFXLIB = ../../ugfxinclude $(CHIBIOS)/boards/ST_STM32F4_DISCOVERY/board.mkinclude $(CHIBIOS)/os/hal/platforms/STM32F4xx/platform.mkinclude $(CHIBIOS)/os/hal/hal.mkinclude $(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F4xx/port.mkinclude $(CHIBIOS)/os/kernel/kernel.mkinclude $(GFXLIB)/gfx.mkinclude $(GFXLIB)/boards/base/STM32F407/board.mk # board# Define linker script file hereLDSCRIPT= $(PORTLD)/STM32F407xG.ld#LDSCRIPT= $(PORTLD)/STM32F407xG_CCM.ld# C sources that can be compiled in ARM or THUMB mode depending on the global# setting.CSRC = $(PORTSRC) \ $(KERNSRC) \ $(TESTSRC) \ $(HALSRC) \ $(PLATFORMSRC) \ $(BOARDSRC) \ $(GFXSRC) \ $(CHIBIOS)/os/various/devices_lib/accel/lis302dl.c \ $(CHIBIOS)/os/various/chprintf.c \ main.c# C++ sources that can be compiled in ARM or THUMB mode depending on the global# setting.CPPSRC =# C sources to be compiled in ARM mode regardless of the global setting.# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler# option that results in lower performance and larger code size.ACSRC =# C++ sources to be compiled in ARM mode regardless of the global setting.# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler# option that results in lower performance and larger code size.ACPPSRC =# C sources to be compiled in THUMB mode regardless of the global setting.# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler# option that results in lower performance and larger code size.TCSRC =# C sources to be compiled in THUMB mode regardless of the global setting.# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler# option that results in lower performance and larger code size.TCPPSRC =# List ASM source files hereASMSRC = $(PORTASM)INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ $(HALINC) $(PLATFORMINC) $(BOARDINC) \ $(GFXINC) \ $(CHIBIOS)/os/various/devices_lib/accel \ $(CHIBIOS)/os/various## Project, sources and paths############################################################################################################################################################# Compiler settings#MCU = cortex-m4#TRGT = arm-elf-TRGT = arm-none-eabi-CC = $(TRGT)gccCPPC = $(TRGT)g++# Enable loading with g++ only if you need C++ runtime support.# NOTE: You can use C++ even without C++ support if you are careful. C++# runtime support makes code size explode.LD = $(TRGT)gcc#LD = $(TRGT)g++CP = $(TRGT)objcopyAS = $(TRGT)gcc -x assembler-with-cppOD = $(TRGT)objdumpSZ = $(TRGT)sizeHEX = $(CP) -O ihexBIN = $(CP) -O binary# ARM-specific options hereAOPT =# THUMB-specific options hereTOPT = -mthumb -DTHUMB# Define C warning options hereCWARN = -Wall -Wextra -Wstrict-prototypes# Define C++ warning options hereCPPWARN = -Wall -Wextra## Compiler settings############################################################################################################################################################# Start of default section## List all default C defines here, like -D_DEBUG=1DDEFS =# List all default ASM defines here, like -D_DEBUG=1DADEFS =# List all default directories to look for include files hereDINCDIR =# List the default directory to look for the libraries hereDLIBDIR =# List all default libraries hereDLIBS =## End of default section############################################################################################################################################################# Start of user section## List all user C define here, like -D_DEBUG=1UDEFS =# Define ASM defines hereUADEFS =# List all user directories hereUINCDIR =# List the user directory to look for the libraries hereULIBDIR =# List all user libraries hereULIBS =## End of user defines##############################################################################RULESPATH = $(CHIBIOS)/os/ports/GCC/ARMCMxinclude $(RULESPATH)/rules.mkWhat could be wrong? Microsd card is partitioned in FAT and there is also test.txt file on it which i would like to read. P.S i'm using Open407V-D development board(http://www.wvshare.com/product/Open407V-D-Standard.htm) which has a SDIO socket. Link to comment Share on other sites More sharing options...
Joel Bodenmann Posted February 4, 2015 Report Share Posted February 4, 2015 Hello pur300 and welcome to the communit!Have you made sure that the pins of your MCU are properly configured?Also, try out one of the ChibiOS/RT demos that use FatFS on the STM32F4 first. This helps you to make sure that the actual hardware is running without any problems.Otherwise, can you try to call gfileMount() manually in order to check its return value? If it fails you can step through the code to reveal the actual problem.~ Tectu Link to comment Share on other sites More sharing options...
pur300 Posted February 4, 2015 Author Report Share Posted February 4, 2015 I've tried to configure pins in a board.h header file. I've configured GPIOC pins 8,9,10,11,12 and GPIOD pin 2 as an alternate function(AF12).Here is my board.h file: http://pastebin.com/MPenTVWTAfter that i've tried to configure and activate SDC peripheral with functions sdcStart() and sdcConnect(). Function sdcConnect() which initializes an sd card always returns false.Here is my test code:#include "ch.h"#include "hal.h"bool_t test = false;SDCConfig conf = {0};int main(void){ halInit(); // board/device initialization chSysInit(); // brings up the kernel and sets up "main" as a thread sdcStart(&SDCD1, &conf); test = sdcConnect(&SDCD1); while(1){ chThdSleepMilliseconds(1000); } return 0;} Link to comment Share on other sites More sharing options...
Joel Bodenmann Posted February 4, 2015 Report Share Posted February 4, 2015 This looks like a ChibiOS/RT issue then. I'm sadly not able to verify the pin asignment of your project until the weekend.Probably taking this to the ChibiOS/RT forum would speed up the process of finding the issue.If you have your SD card working under ChibiOS/RT it should just work without any problems with the GFILE module.~ Tectu Link to comment Share on other sites More sharing options...
pur300 Posted February 5, 2015 Author Report Share Posted February 5, 2015 I've managed to read a content of a file in chibios, but i haven't been able to do it in ugfx. I have also configured all pins in board.h file which is located under ugfx/boards/base/STM32F407/chibios_board directory(i copied board files from chibios dir) the same as i did in the chibios board.h file. Do i have to add #define GFILE_NEED_CHIBIOSFS TRUE or #define GFILE_NEED_FATFS TRUE in ugfxconf.h file? Link to comment Share on other sites More sharing options...
Joel Bodenmann Posted February 5, 2015 Report Share Posted February 5, 2015 Do i have to add #define GFILE_NEED_CHIBIOSFS TRUE or #define GFILE_NEED_FATFS TRUE in ugfxconf.h file?You have to enable the following things in your configuration file:GFX_USE_GFILEGFILE_NEED_FATFSThen it should be working ~ Tectu Link to comment Share on other sites More sharing options...
pur300 Posted February 5, 2015 Author Report Share Posted February 5, 2015 I configured ugfx lib and now it finally reads files from an sd card. Is it necessary to add sdcStart() and sdcConnect() function calls before i can use gfile module? Doesn't ugfx lib call all the necessary underlying chibios initialization functions for its modules? Do i have to explicitly call halInit() and chSysInit() before i can use ugfx and gos module, or is it enough just to call gfxInit()? Link to comment Share on other sites More sharing options...
Joel Bodenmann Posted February 5, 2015 Report Share Posted February 5, 2015 Glad to hear that you got it working now!Is it necessary to add sdcStart() and sdcConnect() function calls before i can use gfile module? Doesn't ugfx lib call all the necessary underlying chibios initialization functions for its modules?With the current implementation you have to do this manually in your own application code as this is hardware/peripheral specific. For a display or touchscreen you would simply do it in the init() routine of the board file. The GFILE module does however not have a board file. This is probably something we should consider to redesign. Just call them manually for now.Do i have to explicitly call halInit() and chSysInit() before i can use ugfx and gos module, or is it enough just to call gfxInit()?You can actually specify the behavior of the gfxInit() call. There is a setting in the configuration file called GFX_NO_OS_INIT. If this is set to FALSE gfxInit() will automatically call halInit() and chSysInit(). If it is set to TRUE you will have to call them manually.~ Tectu Link to comment Share on other sites More sharing options...
pur300 Posted February 5, 2015 Author Report Share Posted February 5, 2015 Thank you for all your help i really appreciate it. It is a very great and useful library. I will definitely recommend it to other people. Link to comment Share on other sites More sharing options...
Joel Bodenmann Posted February 6, 2015 Report Share Posted February 6, 2015 Thank you very much for the good words Let us know whenever you have any other problems or questions!~ Tectu Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now