Voir la version complète : [NDS][Tutorial] Utilisation de la LibFat sous devkitpro
Utilisation de la LibFat sous devkitpro
Auteur : Arialia
Préambule :
Alors voilà je me lance aujourd'hui dans un tutoriel pour programmer avec la nouvelle LibFat de Chism qui est maintenant incluse dans Devkitpro.
La nouvelle librairie de Chism nous fait faire un bond en avant, elle prend en compte de nombreux matériels et est devenue hyper simple à utiliser (une fois que l'on a compris le principe B) ) du coup aucun exemple ou documentation n'est disponible :o
(sauf ici (http://forum.gbadev.org/viewtopic.php?t=10289&postdays=0&postorder=asc&start=0) en anglais merci KoshNi:) )
Les linkers fleurissant régulièrement Chism à décidé de fournir un système de patchage de pilotes appelé DLDI (http://chishm.drunkencoders.com/DLDI/), dorénavant les développeurs n'auront plus à recompiler leur application, et les fabricants de linkers auront juste à fournir le pilote de leur matériel quant à l'utilisateur si la rom ne supporte pas nativement son linker il pourra la patcher avec le pilote adéquat.
Fonctions Fichiers :
Pour ceux qui trépignent déjà voici un exemple de code :
#include <stdio.h> // nécessaire pour la gestion fichier
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include "fat.h"
char *nomfic="testbuf.txt";
int fd=0,ret=0;
char buff[80]="";
char mesg[7]="Vive PA";
bool bfatok = fatInitDefault(); // seule fonction de la libfat directement appellée
if (bfatok)
{
iprintf("fat initialisé\n");
}
else
{iprintf("fat init echec\n");
};
//...
if (bfatok)
{
fd=open("test.txt",O_RDWR);
printf("fd :%d\n",fd);
ret=read(fd,buff,80);
buff[ret]='\0';
printf("buff: %s \nlong: %d octets\n",buff,ret);
write(fd,mesg,7);
close(fd);
}
//...
Vous avez compris? Eh oui ç'est bien çà : une fois le pilote FAT initialisé vous pouvez utiliser toutes les fonctions fichiers standards du c !!!B)
Fonctions Répertoires :
Devkitpro R20 et +
Depuis DevkitPro R20 les fonctions de listage des répertoires sont présentes, mais attention ce n'est pas du Posix ... ç'est beaucoup plus efficace B)
Voici les fonctions spécifiques :
DIR_ITER* diropen (const char *path);
Ouvre le répertoire "path" et retourne un pointeur sur une structure DIR_ITER
en posix ç'est DIR* diropen(const char *path);
nop
int dirreset (DIR_ITER *dirState);
Revient au début du répertoire ==> rewinddir(DIR* dir) en posix ...
nop
int dirnext (DIR_ITER *dirState, char *filename, struct stat *filestat);
Lit la prochaine entrée de répertoire
filename : Nom de l'entrée
filestat : structure stat de l'entrée, mettre à NULL si vous n'en avez pas besoin ...
retourne 0 si nouvelle entrée
retourne -1 si fin de répertoire ou erreur ...
j'avoue que l'idée de récupérer les stats au passage est géniale et évite beaucoup de code supplémentaire ...B)
==> dirent* readdir(DIR* dir) en posix ....
nop
int dirclose (DIR_ITER *dirState);
ferme le répertoire ...
nop
un bout de code pour illustrer cela:
...
dirnext should now return 0 when it finds a valid dir entry, and -1 at all other times.
Return -1 with errno==ENOENT indicates that it has reached the end of the directory.
So a simple example (untested, should work) would be:
#include <sys/stat.h>
#include <sys/dir.h>
struct stat st;
char filename[MAX_FILENAME_LEN]; // may need to be 256 instead of a constant
DIR_ITER* dir;
dir = diropen ("/"); // no error checking -- make sure you check for NULL!
while (dirnext(dir, filename, &st) == 0) {
// st.st_mode & S_IFDIR indicates a directory
printf ("%s: %s\n", (st.st_mode & S_IFDIR ? " DIR" : "FILE"), filename);
}
Devkitpro R19b
Pour ceux qui ne sont pas encore sous Devkitpro R20 ....
Il ya un bémol : j'ai eu beau chercher je n'ai pas trouver de fonctions sur les répertoires dans devkitarm ou dans les fonctions publiques de la librairie FAT ...:hmm: (normal ç'est devkitpro r20 qui doit apporter le support ...annoncé fin janvier...:) ... ça y est :) )
Alors j'ai pris mon courage à deux mains et je nous ai écris les fonctions manquantes : opendir, readdir, closedir, et rewinddir
le but est de pouvoir utiliser du code C standard (Posix) dans nos homebrews
Merci Chism (et ceux qui l'ont aidé ...) :wub:
Descriptif Librairie :
Maintenant que je vous ai expliqué le principe général de la librairie passons au descriptif détaillé :
1 - bool fatInit (u32 cacheSize, bool setAsDefaultDevice);
Initialise tout linker inséré (soit dans le port DS , soit dans le port GBA)
Ajoute le pilote Fat à "devoptab" rendant utilisable pour les fonctions fichiers standards
cacheSize: le nombre de pages à allouer pour chaque linker inséré
setAsDefaultDevice: si vrai rend le pilote FAT le pilote par défaut pour les opérations fichiers
2 - bool fatInitDefault (void);
Appelle fatInit avec setAsDefaultDevice=true et cacheSize optimisé pour le système
à traduire
3 - bool fatMountNormalInterface (PARTITION_INTERFACE partitionNumber, u32 cacheSize);
Mount the device specified by partitionNumber
PD_DEFAULT is not allowed, use _FAT_partition_setDefaultDevice
PD_CUSTOM is not allowed, use _FAT_partition_mountCustomDevice
4 - bool fatMountCustomInterface (const struct IO_INTERFACE_STRUCT* device, u32 cacheSize);
Mount a partition on a custom device
5 - bool fatUnmount (PARTITION_INTERFACE partitionNumber);
Unmount the partition specified by partitionNumber
If there are open files, it will fail
6 - bool fatUnsafeUnmount (PARTITION_INTERFACE partitionNumber);
Forcibly unmount the partition specified by partitionNumber
Any open files on the partition will become invalid
The cache will be invalidated, and any unflushed writes will be lost
7 - bool fatSetDefaultInterface (PARTITION_INTERFACE partitionNumber);
Set the default device for access by fat: and fat0:
PD_DEFAULT is unallowed.
Doesn't do anything useful on GBA, since there is only one device
#ifdef NDS
typedef enum {PI_DEFAULT, PI_SLOT_1, PI_SLOT_2, PI_CUSTOM} PARTITION_INTERFACE;
#else
typedef enum {PI_CART_SLOT} PARTITION_INTERFACE;
#endif
En fait ce qu'appelle Chism avec le terme PARTITION_NUMBER c'est le port où le périphérique est inséré.
Les fichiers sont accessibles sous la forme "device:/rep1/rep2/nomfic.ext"
avec pour device les valeurs suivantes possibles :
- fat1 : linker dans le slot DS
- fat2 : linker dans le slot GBA
- fat3 : pilote personnalisé
- fat0 ou fat: par défaut (fat1 si inséré sinon fat2)
"fat0:/rep1/rep2/nomfic.ext" est donc identique à "fat:/rep1/rep2/nomfic.ext" et aussi à "/rep1/rep2/nomfic.ext"
Je n'ai pas encore testé avec ce type d'accès
Exemples :
Voici un exemple complet avec en prime les fonctions de répertoire qui j'espère ne tarderont pas à faire leur apparition sous Devkitpro20 :rolleyes:
- Test LibFat GBA:443
ce programme permet de vérifier la compatibilité de votre matériel avec la dernière LibFAT (20060813), évidemment je vous conseille de sauvegarder vos données avant car le programme écrit deux fichiers un en accès direct, l'autre en bufferisé.
- Test LibFat NDS version libfat(20060813) modifiée DLDI:
509
Cette version permet de lister le premier répertoire de chaque répertoire ou de remonter au père si dossier vide ... permet de tester l'accés du genre /GBA/Action/../Action/../Action .... ;) jusqu'au plantage ... :p
A ce propos mon homebrew est le premier qui ne m'a pas flingué mes données sur ma miniSD dans ma supercardMiniSDB) . Donc allez-y ....
J'espère que mon tuto vous a plu ....
Pourquoi ne pas utiliser les accès "bufferés" (fopen, fread, fwrite) plutot que les accès directs (open, read, write) ?
Sinon, chouette tuto, merci ! :)
J'ai trouvé ici http://forum.gbadev.org/viewtopic.php?p=107300#107300 une des dernières versions de la libfat (28/10), je la mets en pièce jointe. Mais je ne sais pas comment m'en servir dans un de mes projets ? A la place de la version actuelle ?
J'ai trouvé ici http://forum.gbadev.org/viewtopic.php?p=107300#107300 une des dernières versions de la libfat (28/10), je la mets en pièce jointe. Mais je ne sais pas comment m'en servir dans un de mes projets ? A la place de la version actuelle ?
Merci pour ce topic... Superbe info...
J'ai récupéré le source ici
http://chishm.drunkencoders.com/libfat/20061028/libfat-src-20061028.tar.bz2
Apparemment tout est prêt pour la gestion des répertoires, ya plus qu'à attendre la nouvelle version de devkitpro B)
si tu es pressé et que tu as besoin de la gestion des répertoires, tu peux remplacer dans ce que je vous ai fourni le contenu de 'source/fat' par le contenu 'source' de l'archive ci-dessus.
Si tu es juste interressé par les accès fichiers, alors tu mets le 'fat.h' donné dans 'devkitpro/libnds/include' et le nouveau 'libfat.a' dans 'devkitpro/libnds/lib'
Suivant le cas tu utilises :
#include <fat.h> // utilisation librairie devkitpro
#include "fat.h" // utilisation librairie dans tes sources
Faudra que je mettes à jour le tuto :-'
EDIT :
Attention : je n'ai pas eu le temps de tester la dernière version de Chism ... Alors comme il a dit qu'il y avait des risques de changement interne dans sa lib ... je ne garantis pas que mon code (dirent.c) fonctionne avec sa nouvelle version, de plus il ne l'a pas encore réellement publiée (dispo en version CVS normallement).
=_=
Bobby Sixkilla
11/11/2006, 15h53
Merci Arialia pour ce tuto. :wub:
J'ai fait quelques petites modifications :
- lien sur le topic de chism ...
- explications sur les "device"
J'espère vous peaufiner ça bientôt ...B)
Au fait ç'est valable aussi pour GBA ;)
d'ailleurs ma rom est une rom GBA ... le fiston avait embarqué sa DS ...v_v
Tembargo
14/11/2006, 22h45
Je pense utiliser ça dans pas longtemps :)
Donc je te dis déjà merci pour le fait d'avoir fait ce joli tuto ;)
Et je te dirais ce que j'en pense après utilisation dans pas longtemps :D
C'est bizarre, dans ton code tu utilise read, open etc au lieu de fopen, fread etc?
comment on fait un fseek dans ton cas? (puisque j'arrive a faire marcher un truc basé sur ton dirent, qui m'est très utile au passage en attendant la r20 de devkitpro ;))
Dr.Vince
16/01/2007, 00h39
tiens j'étais passé à côté de ça, par dirent tu entends les fonctions de listage de contenu de répertoire ???
et sinon ce tuto correspond à la version DLDI ou pas ?? d'ailleurs si quelqu'un sait comment s'en servir....
C'est bizarre, dans ton code tu utilise read, open etc au lieu de fopen, fread etc?
comment on fait un fseek dans ton cas? (puisque j'arrive a faire marcher un truc basé sur ton dirent, qui m'est très utile au passage en attendant la r20 de devkitpro )
J'ai utilisé les fonctions open,read, etc car ce sont les fonctions de bas niveau utilisées par les fonctions fichiers bufferisées et vu les problèmes que j'ai eu avec les homebrews avant la libfat j'ai préféré tester avec les fonctions de base ...^^
Sinon j'ai testé les fonctions bufferisées dans mon exemple, cela marche bien,
tu utilises fseek comme sur les autres plateformes ... ç'est ça la force de la libfat, tu peux même reprendre le source des librairies génériques genre libjpeg etc très facilement ... trop cool :w00t: B) (perso j'ai compilé la libjpeg sans pb pour la gba et la nds juste à adapter le makefile ç'est tout ...)
tiens j'étais passé à côté de ça, par dirent tu entends les fonctions de listage de contenu de répertoire ???
et sinon ce tuto correspond à la version DLDI ou pas ?? d'ailleurs si quelqu'un sait comment s'en servir....
Exact ce sont les fonctions de listage des répertoires.
Valable aussi pour la version DLDI, sauf que Chism à enlevé la possibilité d'accéder en même temps à un linker slot1 et à un autre dans le slot2 ...
Il faut juste compiler avec sa dernière version de libfat B)
En fait côté dev le DLDI ç'est cool : tu compiles avec la dernière version de la libfat (au moins http://chishm.drunkencoders.com/libfat/20061225/libfat-nds-20061225.tar.bz2 , source http://chishm.drunkencoders.com/libfat/20061225/libfat-src-20061225.tar.bz2 ) et ... ç'est tout. C'est l'utilisateur final qui patche ta rom avec le pilote DLDI qui l'intéresse.
Sinon devkitpro R20 arrive bientôt (post ici (http://forum.gbadev.org/viewtopic.php?p=113890#113890)):
But wintermute is right, it's a bit of a struggle in practice. End-users should just quit being lazy and patch their homebrew themselves.
If no one comes through with an implementation of this suggestion, does this include buying a PC that runs Microsoft Windows with which to do so?
source is provided, along with linux and windows binaries.
I'm intending to provide this tool with devkitARM r20 which should hopefully be released by the end of January. Assuming my OSX colleagues are available then everyone should be pretty happy.
I now have newlib 1.15.0 built with the psuedo device API updated for the directory listing functions. There are also several fixes in the base rules for arm/itcm/iwram code as noted in other places by gmiller.
I'm also hoping to include git and several examples using this marvellous image processor.
Je pense tester bientôt le DLDI pour mon projet que je réalise pour la compo (PALIB,NINTENDOMAX,Portabledev) enfin si j'ai le temps je suis un peu à la bourre ... heureusement qu'ils ont repoussé de 2 semaines !!!:-' :rolleyes:
promis après la compo je vous mets à jour le tuto ...:p
zut déjà si tard que çà !!:blink: je vais encore être une zombie moi !!!:lol: :D
bonne nuit , bonne année .....
Dr.Vince
17/01/2007, 13h18
merci pour les réponses
Heu, c'est normal que le nom d'une entrée de répertoire soit sur 8 lettres (pas de support long file name?) et bug avec des fichiers contenant des majuscules, espaces, chiffres etc dans leur nom? :/
PS: désolé pour le double post, j'aurais pu editer mais on aurait pas vu le changement ;)
Euh moi j'ai ça sous Dualis (emulation GBAMP) :hmm: :
http://arialia.free.fr/images/capture%20ds.png
Je testerais demain avec la SCMiniSD.
Version LibFat : 13/08/2006
faudra que je teste aussi avec la version DLDI ...
Dr.Vince
21/01/2007, 01h46
bon bah je viens de tester avec la version DLDI (du 25/12/2006) , et ça fonctionne pas, que je patch ou pas FAT_InitDefault retourne false sur ma SCSD.....
voilà le code :
// Includes
#include <PA9.h> // Include for PA_Lib
#include "fat.h"
u8 line = 0 ;
// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initializes PA_Lib
PA_InitVBL(); // Initializes a standard VBL
PA_InitText(0,0);
PA_InitText(1,0);
PA_OutputSimpleText(0,0,line++,"Test...");
if(fatInitDefault()){
PA_OutputSimpleText(0,0,line++,"FAT init OK");
}
else{
PA_OutputSimpleText(0,0,line++,"FAT init BAD");
}
// Infinite loop to keep the program running
while (1)
{
PA_WaitForVBL();
}
return 0;
} // End of main()
moi avec la version DLDI du 28/10 ca marche mais ya des soucis avecles fichiers de + de 8 carac et contenant des carac spéciaux :/
J'ai fait pas mal de test hier résultats en bref :
Supercard SD firmware 1.63 : utiliser le pilote DLDI fait par moonlight ( dans archive Moonshell) :wub:
gestion des répertoires : marche pas avec la nouvelle version de libfat ...:cry:
comme j'ai pas trop le temps de fouiller j'ai essayé en transformant la 13082006 en version DLDI : marche nickel :)
ci-dessous code du fichier "disc.c" à modifier (ne pas oublier les fichiers io_dldi.h et io_dldi.s
// Include known io-interfaces:
#include "io_dldi.h" // à ajouter
#include "io_mpcf.h"
#include "io_m3cf.h"
#include "io_m3sd.h"
#include "io_sccf.h"
#include "io_scsd.h"
#include "io_fcsr.h"
#include "io_nmmc.h"
#include "io_efa2.h"
#include "io_mmcf.h"
#include "io_njsd.h"
const IO_INTERFACE* ioInterfaces[] = {
&_io_dldi, // Reserved for new interfaces // à ajouter
#ifdef NDS
// Place Slot 1 (DS Card) interfaces here
&_io_njsd, &_io_nmmc,
#endif
// Place Slot 2 (GBA Cart) interfaces here
&_io_mpcf, &_io_m3cf, &_io_sccf, &_io_scsd, &_io_m3sd, &_io_fcsr
// Experimental Slot 2 interfaces
, &_io_mmcf, &_io_efa2
};
Encore quelques soucis en chemin relatif ... :unsure: sinon marche nickel.
[Edit]
test sur Supercard MiniSD : Ok
test sur Supercard SD : Ok après patch DLDI SCSD Moon
Moi j'ai réussi à faire marcher avec la version DLDI du 25/12/06 (si ca intéresse quelqu'un, je mettrai la source, j'ai juste commenté les lignes problématique et tout marche nickel).
Le souci ets toujours la gestion des noms de fichiers long :( j'ai essayé avec toutes les versions (y compris ton originale qui marche sous dsemu) et rien a faire, si y'a des espaces et/ou plus de 8 carac dans le nom, ca plante ou ignore le fichier (pas vu), que ce soit sur ma supercard sd ou sur mon DS-Xtreme :/
Apparement c'est possible que ca vienne du fait que mes fichiers se trouvent dans un sous-répertoire (a la racine ca marcherait ptetre, j'ai pas testé)...
Si t'as une idée du problème hésites pas :p
Edit: au fait tu pourrais lacher la version NDS de ta source (dirent) stp? ce serait super pratique pour faire des tests ^^
Dr.Vince
22/01/2007, 20h38
@Arialia : quand tu dis que la gestion des rep fonctionne pas tu parles de ton zip dirent ??
@Noda : moi ça m'intéresse pour la correction de la version du 25/12/06
voilà :)
http://noda.free.fr/wtd/fatDLDI.rar
@Arialia : quand tu dis que la gestion des rep fonctionne pas tu parles de ton zip dirent ??
de mes fonctions opendir et readdir de dirent.c précisément, hier j'ai essayé de les réecrire en m'inspirant de celle de chism (je sais pas encore utiliser les fonctions réentrantes) ça me plante la ds >(
sinon je pensais à la police, car j'ai eu des pb avec celle par défaut ...
Voilà une version de dirent DLDI (source et binaires) pour la DS
avec en prime une jolie police de caractères .....:p
je peux pas la tester sur la DS : mon fiston s'en sert de réveil :wub:
ah oui j'ai fait un fichier texte dont le nom est long B)
[Edit] version libfat : 13082006 avec DLDI ;)
dirent_nds.zip (http://www.playeradvance.org/forum/attachment.php?attachmentid=509&d=1169575189)
Permet de lister aussi le premier répertoire ....
Modification du tuto : explication sur le DLDI + lien
ajout de cette version de dirent
Merci Noda pour ta demande çà m'a permis de déboguer mon projet B)
archeide
23/01/2007, 20h37
Je n'avais pas vu ce topic, c'est génial tout ca!
Moi qui cherchait désespérement à me débarasser de ma vieille gba_fat_lib, que je gardais à cause du manque des fonctions de listing !
Je vais essayer de l'utiliser dans la prochaine version de snemulds
Merci encore!
Merci Noda pour ta demande çà m'a permis de déboguer mon projet B)
De rien, merci à toi pour toutes ces infos et pour tes sources, ca m'a permis de rajouter le support libfat dans mon jeu en quelques minutes seulement (+ les quelques heures pour débugguer toutes les fonctions autours ^^)
Edit: YESS!!!! Grace a toi j'ai trouvé mon bug avec les noms de + de 8 carac ^^
en fait c'st tout con (mais chelou): Je filtre les fichiers par extension (*.tdm) or,
-si un nom de fichier fait 8 carac max sans carac spéciaux, le nom (et l'extension) seront reconnu en majuscules
-si un nom fait plus de 8 carac ou contient des carac spéciaux, le nom et l'extension correspondront à la casse originale (minuscule la plupart du temps)
Devinez quoi? je filtrai avec les majuscules (car en testant j'avais trouvé que ca marchait comme ca) avec *.TDM
en filtrant sans tenir compte de la casse, bingo! :)
Donc encore merci Arialia, grace à toi on a une lib nickel qui marche avec la toute dernière version de la libfat (modifiée par mes soins) pour les répertoires (vu que le bug venait de mon code ;))
Dr.Vince
23/01/2007, 23h23
tu pourrais poster la dernière version avec les répertoires qui fonctionnent Noda ??
sinon autre question, vous savez si cette version nécessite le dernier devkitpro où alors est compatible avec la r18 ???
et pour finir, vous pourriez expliquer vite fait ce que vous avez compris (et donc modifier) de la libFAT, car j'ai regarder vite fait et j'ai pas trop pigé
exemple :
const IO_INTERFACE* ioInterfaces[] = {
&_io_dldi, // Reserved for new interfaces // à ajouter
#ifdef NDS
// Place Slot 1 (DS Card) interfaces here
&_io_njsd, &_io_nmmc,
#endif
// Place Slot 2 (GBA Cart) interfaces here
&_io_mpcf, &_io_m3cf, &_io_sccf, &_io_scsd, &_io_m3sd, &_io_fcsr
// Experimental Slot 2 interfaces
, &_io_mmcf, &_io_efa2
};
la libFAT est censé être dynamique et pourtant là y a des matos coder en dur !?!?!?
sinon autre question, vous savez si cette version nécessite le dernier devkitpro où alors est compatible avec la r18 ???
j'ai bien peur qu'il faille la dernière r19b mais je suis pas sûre ....:-'
et pour finir, vous pourriez expliquer vite fait ce que vous avez compris (et donc modifier) de la libFAT, car j'ai regarder vite fait et j'ai pas trop pigé
exemple :
const IO_INTERFACE* ioInterfaces[] = {
&_io_dldi, // Reserved for new interfaces // à ajouter
#ifdef NDS
// Place Slot 1 (DS Card) interfaces here
&_io_njsd, &_io_nmmc,
#endif
// Place Slot 2 (GBA Cart) interfaces here
&_io_mpcf, &_io_m3cf, &_io_sccf, &_io_scsd, &_io_m3sd, &_io_fcsr
// Experimental Slot 2 interfaces
, &_io_mmcf, &_io_efa2
};
la libFAT est censé être dynamique et pourtant là y a des matos coder en dur !?!?!?
En fait comme ça ta rom peut marcher sans patch avec les anciens pilotes
çà prend 32k je crois ... si tu veux faire un peu de place ou forcer l'utilisateur à patcher même pour un vieux linker :devil: à toi de voir B) .... Chism à virer les expérimentals dans sa dernière version je crois ...
const IO_INTERFACE* ioInterfaces[] = {
&_io_dldi, // Reserved for new interfaces // à ajouter
// à partir de là facultatif
#ifdef NDS
// Place Slot 1 (DS Card) interfaces here
&_io_njsd, &_io_nmmc,
#endif
// Place Slot 2 (GBA Cart) interfaces here
&_io_mpcf, &_io_m3cf, &_io_sccf, &_io_scsd, &_io_m3sd, &_io_fcsr
// Experimental Slot 2 interfaces
, &_io_mmcf, &_io_efa2
// jusqu'ici
};
C'est exactement ca ;)
Et sinon t'as juste à récupérer le derier "dirent.c/h" de Arialia et de le mettre dans les sources modifiés de la derniere fatlib que j'ai posté précédemment.
En gros ca donne ca la structure:
/fat.h
/dirent.c
/dirent.h
/fat/"le reste"
Dr.Vince
24/01/2007, 02h34
ok merci bien
dernière question : ce serait possible de savoir ce que tu as modifié exactement Noda, au cas où un bug se déclare....
J'ai juste commenté les fonctions concernant les appels standard de devkitpro pr les répertoires :)
Dr.Vince
25/01/2007, 12h27
merci beaucoup Arialia !!! ça fonctionne nickel.
Sinon Noda effectivement, même en prenant la version CVS de la libFAT j'ai des erreurs de compilation avec les fonction sur les répertoires
Petite maj du tuto : fonctions répertoires sous DKP r20 ç'est pas du posix mais ç'est plus efficace ... je vous ferais une version de dirent adaptée dès que possible ...
Je pourrais vous faire une version posix pour le portage si ça vous interresse ....
Faut que je fasse un peu de ménage dans le tuto ... mais priorité à ma maison cette semaine :p
Dr.Vince
06/02/2007, 03h35
y a encore besoin de dirent avec la r20 ???
Non, je voulais parler de l'appli : faut que je lui trouve un autre nom "listdir" ça devrait aller.
Plus besoin de dirent sinon, sauf si tu veux porter un code sans le modifier ...;)
salut,
bon voila je me met a la dldi
et en farfouillant un peu j'ai vu que dans le code des patchs .dldi on pouvait trouver (entre autre) une fonction isInserted visant a vérifier si la carte mémoire est insérée.
j'ai trouvé qu'il pourrait être interressant de disposer de cette fonction pour mon code, mais je n'ai pas trouvé de manière d'accéder a cette fonction (surtout que je peut pas la copier coller vu qu'elle change pour chaque linker, ce qui est bien le principe de la dldi de gérer ce changement :p)
d'ou ma question, comment accéder a cette fonction ou à un equivalent pour pouvoir s'en servir dans le cadre de la dldi afin de vérifier si l'utilisateur a ou pas enlevé la carte mémoire (et donc par exemple se mettre en "pause" et/ou afficher un message adéquat) ?
ou alors il n'y a aucun moyen ?
Hi.Noda can you send me a fat test that open a .txt file made with PALIB.
THX
salut,
bon voila je me met a la dldi
et en farfouillant un peu j'ai vu que dans le code des patchs .dldi on pouvait trouver (entre autre) une fonction isInserted visant a vérifier si la carte mémoire est insérée.
j'ai trouvé qu'il pourrait être intéressant de disposer de cette fonction pour mon code, mais je n'ai pas trouvé de manière d'accéder a cette fonction (surtout que je peut pas la copier coller vu qu'elle change pour chaque linker, ce qui est bien le principe de la dldi de gérer ce changement :p)
d'ou ma question, comment accéder a cette fonction ou à un équivalent pour pouvoir s'en servir dans le cadre de la dldi afin de vérifier si l'utilisateur a ou pas enlevé la carte mémoire (et donc par exemple se mettre en "pause" et/ou afficher un message adéquat) ?
ou alors il n'y a aucun moyen ?
Je pense que le seul moyen est d'incorporer le code de la librairie fat dans ton projet ...
fonction qui je pense te conviendras : FAT_disc_isInserted (const IO_INTERFACE* disc) dans "disc_io/disc.h" ;)
on retrouve effectivement dans ce .h des fonctions dont le nom est tres proche de celles contenues dans les patch DLDI (en fait ya juste "disc_" en plus devant)
malheureusement je crois bien que ces fonctions ne sont pas compatibles DLDI et on peut voir ceci dans le .h:
#define SUPPORT_NMMC // comment out this line to remove Neoflash MK2 MMC Card support
#define SUPPORT_NJSD // comment out this line to remove Ninja FLashed linker support
#define SUPPORT_MMCF // comment out this line to remove Max Media CF support
#define SUPPORT_MPCF // comment out this line to remove GBA Movie Player support
#define SUPPORT_M3CF // comment out this line to remove M3 Perfect CF support
#define SUPPORT_M3SD // comment out this line to remove M3 Perfect SD support
#define SUPPORT_SCCF // comment out this line to remove Supercard CF support
#define SUPPORT_SCSD // comment out this line to remove Supercard SD support
#define SUPPORT_EFA2 // comment out this line to remove EFA2 linker support
//#define SUPPORT_FCSR // comment out this line to remove GBA Flash Cart support
sachant que d'une part je teste avec un R4 et que d'autre part j'aimerais que le code que je fait marche sur un maximum de linker ca n'est je pense pas très viable
merci cependant pour l'info.
Euh, d'après ce que j'ai compris du code le pilote DLDI n'est qu'un modèle de pilote vide avec des points d'entrées (qui par défaut retourne false) faisant une taille imposée qui est remplacé lors du patch DLDI par le pilote DLDI choisi par l'utilisateur.
Les pilotes inclus d'origine ainsi que ceux DLDI doivent respecter la même interface.
Il faut donc utiliser les fonctions "haut niveau" de la librairie qui pointera sur la fonction du pilote actif.
Le code de la fonction "mount.." devrai être assez instructif ... je jettes un oeil ^^
[Edit]
Bon après vérification Chism n'appelles pas cette fonction car avec les linkers sans carte elle n'est pas très utile il essaye tout de suite de lire le premier secteur FAT quand il monte le linker donc je n'ai pas trouvé de code haut niveau l'utilisant mais je pense que les codes suivants devraient marcher ... je n'ai pas testé ....;)
bool bCarteInseree(PARTITION_INTERFACE partitionNumber)
{
const IO_INTERFACE* disc = NULL;
if (_FAT_partitions[partitionNumber] == NULL) {
switch (partitionNumber) {
case PI_SLOT_1:
// Mount the disc in slot 1
disc = _FAT_disc_dsSlotFindInterface ();
break;
case PI_SLOT_2:
// Mount the disc in slot 2
disc = _FAT_disc_gbaSlotFindInterface ();
break;
case PI_DEFAULT:
// Mount the disc in slot 1
disc = _FAT_disc_dsSlotFindInterface ();
if (disc ==NULL) disc = _FAT_disc_gbaSlotFindInterface ();
break;
case PI_CUSTOM:
default:
// Anything else has to be handled specially
return false;
break;
}
else
{
PARTITION* partition=_FAT_partitions[numpartition];
disc = partition->disc;
}
if (disc == NULL) {
return false;
}
return disc->fn_isInserted();
}
code valable pour NDS .... pas GBA ...
bakura52
25/02/2007, 14h16
Bon je vais passer pour un noob mais tant pis... :whst:
J'ai lu toute la discussion mais même avec cela je ne comprend pas comment patcher par exemple picodriveDS avec DLDI...:S
Si quelq'un pouvait m'éclairer....;)
http://chishm.drunkencoders.com/DLDI/
regarde au milieu de la page, il y a des logiciels pour patcher dldi ;)
personnellement j'ai pris la version intégrée au clic droit de la souris, c'est rapide et pratique ;)
Win32 Right Click DLDIrcSetup.exe 2007-01-31 0.3 PsychoWood
bakura52
25/02/2007, 14h27
Ah oui je suis vraiment c** :lol: , y'a une demi heure je suis allez sur cette page et j'ai rien vu ! :lol:
Merci à toi !;)
archipel
23/06/2008, 09h42
bonjour :)
je ne sais pas si depuis le temps il y a mieux pour gerer les fichiers mais j'ai un petit probleme avec fatLib, je met juste :
if(!fatInitDefault()) return 0;
dans mon code et il ne marche plus sur émulateur :S mais sur console si.
Y a t'il un émulateur qui supporte la fatLib ?
HS : EFS, ca marche sur émulateur ?
oui il y à ideas je crois, il faut que tu patches le .nds pour r4.
archipel
23/06/2008, 11h19
ca marche pas chez moi :cry:
Dans files/properties tu doit choisir DLDI:R4
archipel
23/06/2008, 12h12
allelouilla ca marche :D
merci :)
EDIT : je pense que ca peut en aider plus d'un : on peut rendre le patchage automatique en rajoutant ca dans build.bat :
dlditool <name_of_patch> <rom_file>
il faut aussi le dlditool.exe (http://chishm.drunkencoders.com/DLDI/downloads/dlditool-win32.zip) (dans le dossier du batch)
archipel
23/06/2008, 12h38
bah non, mon truc fonctionne pas, vham ne lance pas le build.bat :S
Qu'est ce qu'il lance quand on fait F8 ?
il fait gère tout lui même donc si tu veux modifier quelque chose faut que tu ailles voir dans ses fichier pour le reconfigurer
archipel
23/06/2008, 17h30
pas grave, je vais mettre raccourci vers build.bat, ce sera aussi bien
edit : tch, le build.bat et 12454 fois trop long, il conserve pas les fichier.o
archipel
26/06/2008, 14h45
bon alors ce que j'ai fait au final :
dans mon dldi.bat
dlditool <name_of_patch> <rom_file>
<nomdujeu>.nds
et sur hamSDK :
Advanced -> Configure Extern Tools -> Program (Browse) -> dldi.bat
ItemName DLDI
Hotkey : F9 de toutes facon les autres ont l'air pris
Maintenant, j'ai plus qu'a faire F5 (compiler) et F9 (patcher + lancer le homebrew)
ferrand.d
11/07/2008, 15h06
Bonjour à tous !
Cela fait presque 2 ans que le tuto sur la libfat est sorti, et j'essaye actuellement de recompiler une application qui a à peu près le même âge. J'ai l'impression que certaines choses ont changé dans les librairies utilisées, etc... donc j'espère que vous pourrez m'aider !
Le fichier sur lequel le compilo bloque est celui là
#include <nds.h>
#include <fat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/dir.h>
#define FILE_C
#include "file.h"
#include "heap.h"
#define BLOCK 1
// ...
// la ligne qui bug
DIR_ITER* d;
L'erreur du compilo est :
error: 'DIR_ITER' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
error: for each function it appears in.)
error: 'd' undeclared (first use in this function)
J'ai fait une recherche sur ce DIR_ITER* et je ne sais pas vraiment d'où il sort. Je pense que c'est une histoire de POSIX/pas-POSIX d'après Arialia au début du tuto :
Depuis DevkitPro R20 les fonctions de listage des répertoires sont présentes, mais attention ce n'est pas du Posix ... ç'est beaucoup plus efficace
Voici les fonctions spécifiques :
* DIR_ITER* diropen (const char *path);
Ouvre le répertoire "path" et retourne un pointeur sur une structure DIR_ITER
en posix ç'est DIR* diropen(const char *path);
Bref je suis un peu perdu dans tout ça, et les standards semblent avoir évolué en 2 ans !
Please help !
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org