Crunchez vos adresses URL
|
Rejoignez notre discord
|
Hébergez vos photos
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 30 sur 34

Discussion: Bus LPC

  1. #1
    Bonjour,

    Je recherche des infos concernant la programation d'un Bus appeller le bus LPC.
    J'utilise une carte X-Board 861 basé sur le processeur Geode SC1200 de AMD compatibles aux architectures x86 (PC). Je travail sous linux avec le Kernel 2.6.

    Mon probleme est donc de réussir à lire et ecrire des données 8 bits sur ce bus LPC.

    Si quelqu'un pouvait m'aider ca serait sympa.

    Merci.

    A plus

  2. #2
    C'est pas le bus créé pour les périphs lents ??? genre com, lpt, etc...
    Mes propos n'engagent personne, même pas moi.

  3. #3
    Oui c'est ca. Et mon but est de lire et d'ecrire des données dans un Altera via le bus LPC.

    A plus

  4. #4
    Comme c'est sous Linux il doit y avoir un driver et donc un fichier dans /dev qui correspond au controlleur de ce BUS. 'Il faut juste' trouver ce fichier puis regarder dans les headers du noyau/driver pour trouver les constantes qui permettent de configurer le biniou. Apres ce sera juste des read/write sur le fichier.

    J'espère que j'ai dit au moins un truc que tu savais pas
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  5. #5
    Justement je ne le trouve pas.

  6. #6
    Tu trouves pas quoi ? Le /dev ou le fichier d'en-tête ?
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  7. #7
    Desolé, je parlais du Driver.

  8. #8
    Bon je viens de regarder un peu sur le net mais les seuls trucs que je trouve sont tes questions.:D

    Je pense pas pouvoir te dire plus que ce que certains t'on dit. Désolé

    As-tu demandé au fabricant si il avait un driver ? Dans le manuel y'a une memory map dans l'appendix B. (http://www.diamondpoint.co.uk/manual...d/xbd1m122.pdf)

    Visiblement tu connais pas la différence entre le bus io et les périphériques memory mapped. En fait les instructions outb,outw,outd utilisent un bus "spécial" adressé sur 16-bits, ce n'est plus très utilisé en dehors des périphériques anciens (style ISA). Apres les io memory mapped s'adressent comme un acces memoire classique (mov eax,[0x5000]).
    Comme on t'a deja dit : pas de driver -> faut en faire un, car il me semble que les instructions out* sont pas accessibles directement en espace utilisateur.
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  9. #9
    Tu m'as démasqué.
    Tu comprends donc mon probleme.
    Il faut don que je créé un module en mode Kernel qui vienne configurer les registres du bus LPC, puis que je lui reserve une zone mémoire ou seront maper lies I/O que j'utiliserais pour lire ou ecrire des donées. C'est ca ?
    Sinon pour configurer les registres du bus LPC je bloque.
    En effet j'ai créé le module suivant :

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/ioport.h>
    #include <linux/slab.h>
    #include <linux/pci.h>
    #include <linux/list.h>
    #include <linux/interrupt.h>
    #include <asm/uaccess.h>
    #include <asm/dma.h>
    #include <linux/kernel.h>


    MODULE_LICENSE("Dual BSD/GPL");
    static int hello_init(void)
    {
    printk(KERN_ALERT "Hello, world\n");

    outl(0x80008014,0x0CF8);
    printk(KERN_INFO "Valeur 0xCF8 : 0x%x\n",inl(0x0CF8));
    printk(KERN_INFO "Valeur 0xCFC : 0x%x\n",inl(0x0CFC));

    outl(0x80008014,0x0CF8);
    printk(KERN_INFO "Valeur 0xCF8 : 0x%x\n",inl(0x0CF8));
    printk(KERN_INFO "Valeur 0xCFC : 0x%x\n",inl(0x0CFC));

    return 0;
    }

    static void hello_exit(void)
    {
    printk(KERN_ALERT "Goodbye, cruel world\n");
    }
    module_init(hello_init);
    module_exit(hello_exit);

    Ce module me permet de venir lire l'addresse de F0BAR1 (L'adresse de F0BAR1 me permet d'acceder aux registre du bus LPC)
    En venant lire l'adresse 0xCFC j'obtient donc la valeur de 6601.
    Et d'apres la doc les 6 premeir bits correspondent à la plage d'adresse qui est en lecture seulement et les bits 31 à 6 correspondent à l'adresse de Base du LPC.

    J'obtient donc l'adrsse 0x198 et je lui rajoute l'offest correspondant au registre que je veut acceder.

    Et La ou je bloque c que l'adresse obtenu ne me semble pas être la bonne.

    Peut tu m'aider?

  10. #10
    Citation Envoyé par Son_go
    Il faut don que je créé un module en mode Kernel qui vienne configurer les registres du bus LPC
    Je dirais oui. Tu peux même te sevir de ce module pour exporter des fonctions qui permettent de lire et d'écrire sur le bus.

    Citation Envoyé par Son_go
    puis que je lui reserve une zone mémoire ou seront maper lies I/O que j'utiliserais pour lire ou ecrire des donées. C'est ca ?
    Je pense que le "mappage" n'est pas modifiable. Et pui stant que tu as un module kernel autant en profiter et faire comme je t'ai dit au-dessus.

    Si tu pouvais me dire où tu as trouvé les adresses et tout je pourrais regarder. Il y a un truc qui me chiffone dans ton code c'est que tes outl lisent 32 bits et que apparament tu as besoin de valeurs 16 bits.
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  11. #11
    J'ai trouver ces adresses dans la data du geode "32579A_sc1200_ds.pdf" que j'ai dl sur le site de AMD :
    http://www.amd.com/us-en/Connectivit...6_9919,00.html
    c'est "AMD Geode™ SC1200/1201 Processor Data Book"

    page 195, 199 et 212.

  12. #12
    Je regardais sur les docs du X-Board je pouvais toujours chercher.
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  13. #13
    Petite remarque le manuel, page 175 6.3.1 2eme paragraphe, dit qu apres avoir ecrit dans le CAR il faut lire ou écrire le CDR pour effectuer la configuration. Or juste apres toi tu lit le CAR. Ca peut peut-être poser des problèmes ?

    En plus ta valeur que tu mets en F0 ne me semble pas correcte. Ce serait plutot 0x80008050 car l index est décalé de 2bits à gauche.
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  14. #14
    Je pense pas que ca a d'influence, mais je vais essailer.
    Car quand je met les index 00, 04, 08, 0C, j'obtient dans le CDR la valeur "Reset value" pour chaque index de F0.
    Mais je pensais, a quoi ca peut servir que le CDR soit accessible en lecture et en ecriture. Je croyais qu'il servait juste à lire le resultat de la configuration du CAR. Peut être que c'est dans le CDR que je doit rajouter l'offset à F0BAR1 pour acceder au registre du LPC ?

  15. #15
    Je me suis trompé dans le code que je t'ais montré en fait j'envoi ca :

    printk(KERN_INFO "Valeur 0xCF8 : 0x%x\n",inl(0x0CF8));
    printk(KERN_INFO "Valeur 0xCFC : 0x%x\n",inl(0x0CFC)); /*Lecture de 0xCF8 et0xCFC avant modif*/
    outl(0x80009014,0x0CF8);
    printk(KERN_INFO "Valeur 0xCF8 : 0x%x\n",inl(0x0CF8));
    printk(KERN_INFO "Valeur 0xCFC : 0x%x\n",inl(0x0CFC));

    printk(KERN_INFO "Valeur 0x198 : 0x%x\n",inl(0x198)); /*lecture à F0BAR1*/
    printk(KERN_INFO "Valeur 0x1A8 : 0x%x\n",inl(0x1A8)); /*lecture à F0BAR1+offset de 10h) registre LAD_EN du LPC*/

    aux adresses 0x198 et 0x1A8 j'obtient les valeurs FFFFFFFF. C'est pour ca que ca me parait bizar. et de plus si je fais la même opération pour F0BAR0 j'obtient dans le CDR l'adresse 6401.
    Je recuper l'adresse de base au bits 31 à 6 et j'obtient l'adresse 0x190.

    Il doit donc y avoir une erreur d'interprtation de ma part car si on rajoute les offset à F0BAR0, on entre dans l'adresse de F0BAR1.

    Autre constatation lorsqure je tape la commande "cat /prc/ioprts"
    j'obtient :
    6400-643f : 0000:00:12.0
    6600-663f : 0000:00:12.0 ce qui corespond au bus LPC.

    Si j'ai bien compris ca correspond au port I/O resever au bus LPC ?

  16. #16
    Tu veux bien accéder à l'index 14h de F0 ? Dans ce cas ce que tu devrais mettre dans CAR c'est 0x80008050 (ou 0x80009050) non ? en fait 0x50 == 0x14<<2. Je sais pas si tu as essayé. Je sais que je l'ai déjà écrit. Parce que sinon ca me semble bien ce que tu fais :???:
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  17. #17
    Je viens d'essailler de mettre la valeur 0x80009050 ca me donne : 0x39c447b
    ca correspond en grande partie aux "Reset value" de F0 index 50h, 51h, 52h.
    Car il ne faut pas fair de decalage, car dans le CAR les deux prmier bits de F0index sont forcé à 0 car on fais des lecture sur 32 bits. En effet en fesant "inl()" je fais une lecture sur 32 bits peut comprendres plusieur registres.

    Mais une fois que j'ai la valeur de F0BAR1 qui est 6601 que comprend tu toi pour venir recuperer l'addresse de F0BAR1 pour acceder au registre du LPC.

  18. #18
    [QUOTE=Son_go]Je viens d'essailler de mettre la valeur 0x80009050 ca me donne : 0x39c447b
    ca correspond en grande partie aux "Reset value" de F0 index 50h, 51h, 52h.
    Car il ne faut pas fair de decalage, car dans le CAR les deux prmier bits de F0index sont forcé à 0 car on fais des lecture sur 32 bits. En effet en fesant "inl()" je fais une lecture sur 32 bits peut comprendres plusieur registres.

    Mais une fois que j'ai la valeur de F0BAR1 qui est 6601 que comprend tu toi pour venir recuperer l'addresse de F0BAR1 pour acceder au registre du LPC.
    page 212. index 14h-17h

  19. #19
    Ah ok pour le 0x80008014 (et dire que je suis censé t'aider !!)

    Sinon je ferais comme toi.
    - récupérer F0BAR1 qui serait l'adresse de base des registres du LPC en i/o en CDR après avoir rempli CAR.
    - accès aux registres du LPC par F0BAR1+offset en lecture/écriture par inl() outl().

    Sinon je ferais le read sur CDR juste apres le write du CAR. Certes c'est peu probable que ca change quelquechose mais ce serait pour être sûr. Et puis surtout j'ose espérer que quand j'écris quelquechose dans un registre ca le fait correctement.

    Essayer d'enlever le 1 de 0x6601
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  20. #20
    Justement ton post m'a devenceé car si je fait :

    printk(KERN_INFO "Valeur 0x6610 : 0x%x\n",inl(0x6610));

    j'obtient la valeur du registre auquel je veut acceder. Je ne trouve pas d'explication logique (enfin j'en ais quand même peut être une ... mais bref)

    Ce qui me fais penser ca c'est que les 6 premier bits correspondent a la plage d'adresse, il faut donc les iniber (les mettre à 0) et quand je met l'offset 14h et 1C j'obtient bien leur "Reset value". Je sais pas si ma méthode d'analyse est correcte mais ca me parrait logique.

    Sinon peut tu me ré expliquer la difféence entre les io ports et les io mem map.
    Les io ports sont les addresses pour configurer les registes du bus, dans mon cas le bus LPC.
    et les io mem map sont les plages d'adresse relative aux bus dans lequelles ont peut utiliser les instruction outb et nb pour lire et ecrire des donnée sur le bus, dans mon cas le bus LPC

    Est ce que j'ai bon ?

    Si c'est le cas normalement je devrais la connaitre en tapant cat /proc/iomem
    pourtant je ne vois rien concernant le bus LPC ou isa brige ou pour 0000:00:12.1 .

  21. #21
    En fait les x86 disposent de deux espaces d'adressage distincts. La mémoire et le bus i/o. La mémoire on y accède par des mov en asm. Cet espace est pratique car il y a de nombreux modes d'adressage possibles.
    L'autre espace est celui des i/o qui est beaucoup plus limité mais plus simple. Un adressage sur 16-bits et des accès uniquement par outb-w-l ou inb-w-l et un numéro de port soit dans un registre soit en immédiat.

    Après un periphérique peut s'interfacer sur celui qu'il veut voire même sur les deux. Dans les docs apparament ils disent i/o mapped pour le bus i/o et memory mapped quand c'est sur la mémoire.

    Bon pourquoi y'a deux espaces ? Peut-être que chez Intel ils étaient un peu plus visionnaires que Billou et que pour eux 1Mo c'était déjà pas top mais "640 KB ought to be enough for anybody, isn't it ?"

    C'est clair ?
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  22. #22
    Merci pour tes explications.
    Mais concretement dans mon cas les io ports servent a configurer les registres de mon bus LPC. C'est ca ? Et apres comment je fais pour envoyer des données sur mon bus.
    Est ce que c'est par les io memory mapped?

    Si c'est le cas comment je procede ?

    Et page 254 able 6-31 offset 18h-1B pour les bits [15:9] je crois comprendre qu'ils permette de configurer un espace memoire. D'apres toi cette espace me permet il d'envoyer des donnée avec l'instruction inb en mode user ?
    En tout cas pour ce registre la valeur est : 860h ce qui veut dire que la valeur pour les bits 15 à 9 est 04h.

    Sinon j'ai regardé toute les configuration des autre registre et le bus a l'air d'être initialement bien parametré.
    Que me rest-il donc a fair d'apres toi pour que je reussise à envoyer des données sur ce bus ?

  23. #23
    Tu trouveras des infos dans les datasheets des southbridge intel (le pont LPC est une des fonctions des S, par exemple :
    http://www.intel.com/design/chipsets...hts/252516.htm

    Y'a des interfaces GPIO (general purpose io)

    edit : oops j'ai trois trains de retard, j'avais pas tout lu.

  24. #24
    Citation Envoyé par Son_go
    Merci pour tes explications.
    Mais de rien.

    Citation Envoyé par Son_go
    Mais concretement dans mon cas les io ports servent a configurer les registres de mon bus LPC. C'est ca ?
    Je pense que oui. Mais ce n'est pas leur seul role.

    Citation Envoyé par Son_go
    Et apres comment je fais pour envoyer des données sur mon bus.
    Est ce que c'est par les io memory mapped?
    Excellente question. J'ai pas encore trouvé

    Citation Envoyé par Son_go
    Si c'est le cas comment je procede ?
    int * ptr=(int*)0xDEADBEEF;
    *ptr=data;
    En t'étant assuré que tu manipules bien des adresses physiques.

    Citation Envoyé par Son_go
    Et page 254 able 6-31 offset 18h-1B pour les bits [15:9] je crois comprendre qu'ils permette de configurer un espace memoire. D'apres toi cette espace me permet il d'envoyer des donnée avec l'instruction inb en mode user ?
    En tout cas pour ce registre la valeur est : 860h ce qui veut dire que la valeur pour les bits 15 à 9 est 04h.
    Je dirais que c'est pour affecter une adresse i/o à un périphérique rajouté pour les registres de configuration. En gros ca dit que si tu fais une opération i/o dans cette plage d'adresse c'est le controlleur LPC qui enverra les données au périphérique. Ca doit être via cette fonction que tu assignes un port au periph. que tu as rajouté.

    Citation Envoyé par Son_go
    Sinon j'ai regardé toute les configuration des autre registre et le bus a l'air d'être initialement bien parametré.
    Que me rest-il donc a fair d'apres toi pour que je reussise à envoyer des données sur ce bus ?
    Configurer LAD_D1 et l'utiliser comme adresse de base pour ton périphérique et envoyer recevoir via des out* in*.

    edit : comme c'est une archi PC si quelqu'un sait comment le LPC est utilisé precisément.
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  25. #25
    Ok, Merci pour tes infos.
    J'essaillerais ca plutard car je dois fair autre chose aujourd'hui.

    A plus

  26. #26
    Alors j'ai essailé de lire des valeur sur le Bus LPC au adresses :

    0x800 valeur obtenu : ff
    0x400 valeur obtenu : ff
    0x04 valeur obtenu : fd
    0x379 valeur obtenu : ff

    De plus le bus LPC etant relié a un cyclone II je viens Trigger sur le signal LFRAME (signal indiquand le début et la fin de trame du bus LPC) à l'aide du signal tap pour vériffier que le bus LPC est bien utilisé. Or aucune simulation n'apparait, le signal LFRAME ne change donc pas d'état, il n'est donc pas utilisé.

    J'ai aussi esaillé de venir lire à ces même adrresses en mode USER en autorisant l'acces à tous les ports avec la fonction IOPL(3) et le résultat est identique.
    Y a t il une différence entre le mode KERNEL et USER ?

    Pour écrire sur le bus LPC je viens fair un inb ou outb dans les IO mem map configuré dans le registre LAD_1 du bus LPC.
    Si j'ai bien compris les io mem map permettent qe configurer une adresse virtueles à laquelle on viens lire et écrire les données du bus LPc et qui vont écrire directement aux adresses physiques ) c'est bien ca ?

    Si je viens lire à l'adresse configurer dans le registre LAD_1 je devrais donc lire les données sur le bus LPC ?

    Est ce que je doit écrire ce programme en mode KERNEL ou en mode USER ?

    De plus le port parallele est configuré sur le bus LPC et j'avais déja effectué un test sur une carte EVAL possédant un port parrallele et j'arrivais à écrir sur le port, j'en avais donc déduit que je passais par le bus LPC. Cepandant je n'ais aucun résultat avec le signal tap. Que faire ?

  27. #27
    Bonjour,
    Je suis de retour apres 1 semaine de cours et la passage de ma soutenance.
    Bref je suis toujours bloqué au même point, donc pouvez vous m'aider ?
    Merci

  28. #28
    Re-Bonjour

    Bon je n'ai pas trop regardé ca ces derniers temps pour cause de fin de stage (ma soutenance est le mercredi 05/07) j'espère que c'est OK pour toi sinon.

    Je pense que je manque d'expérience. Faudrait voir si y'a pas un support chez AMD ou des exmeples d'utilisastion du LPC.

    Désolé
    "si tout le monde s'etait dit "pour quoi faire ?" je pense qu'on tournerait encore sur 8086. Si tant est qu'on ait l'electricite ... " Franck@X86
    If all goes well will Dell sell Cells?
    <°)))><

  29. #29
    Merci quand même et bon courage pour ta soutenance.

    Donc si quelqu'un pense qu'il peut m'aider n'hésité pas.
    Merci

  30. #30
    Autre question : Comment puis je savoir ou est mappé le bus LPC ?

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •