OpenOCD compatible Vista + tms470 ? (newbie)

Electronique numérique / Circuits logiques programmables EPLD, CPLD, FPGA d'Altera ou de Xilinx VHDL, Verilog ou SystemC

Modérateur : Modérateur

bunn_rath
NOUVEAU
NOUVEAU
Messages : 13
Inscription : 29 mai 2008 15:40

Re: OpenOCD compatible Vista + tms470 ? (newbie)

Message par bunn_rath »

Bonsoir JP et Thierry,

Je sais que vous êtes très occupés... Mais j'aurais besoin de votre aide. :oops:

J'ai téléchargé les fichiers include .h : iotms470r1a256.h, io_macros.h, tms470r1a256_bit_definitions.h.

Le fichier tms470r1a256_bit_definitions.h : va servir à mettre les différents bits des différents registres à 1 par leur nom.
Le fichier io_macros.h : ce fichier définit les périphériques communs à tous les TMS470.
Le fichier iotms470r1a256.h : ce fichier définit les fonctions spéciales des registres pour le TMS470r1a256.

Problème que je rencontre :
Lors de la compilation avec compilateur de WinARM, j'ai des erreurs :
1. Apparemment ce code ne peut être compilé que par le compilateur ICCARM/AARM. (fichier iotms470r1a256.h)
#if (((__TID__ >> 8) & 0x7F) != 0x4F) /* 0x4f = 79 dec */
#error This file should only be compiled by ICCARM/AARM
#endif
Solution : Donc pour éviter cette erreur à la compilation j'ai enlevé ce bout de code. Est-ce que c'est ce qu'il faut faire ?
2. Erreur de compilation sur toutes les instructions de ce type (fichier iotms470r1a256.h):
__IO_REG32_BIT(SMCR0, 0xfffffd00,__READ_WRITE,__smcr0_bits);
3. Warnings à cause du backslash
#define __IO_REG8(NAME, ADDRESS, ATTRIBUTE) \
volatile __no_init ATTRIBUTE unsigned char NAME @ ADDRESS
Il y a en plus des parties de code que je ne comprends pas bien (ce qui est en gras) :
1. #ifdef __IAR_SYSTEMS_ICC__
2. #ifndef _SYSTEM_BUILD
#pragma system_include
#endif
3. #define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)\
volatile __no_init ATTRIBUTE union
{
unsigned char NAME;
BIT_STRUCT NAME ## _bit; \
} @ ADDRESS
4. #if (((__TID__ >> 8) & 0x7F) != 0x4F) /* 0x4f = 79 dec */
#error This file should only be compiled by ICCARM/AARM
#endif
5. #if __LITTLE_ENDIAN__ == 1
#error This file should only be compiled in big endian mode
#endif
Si vous pourriez encore m'éclairer, je serais vraiment ravi. :-D
Je sais que j'abuse :roll: , mais en ce moment, je me sens un peu seul face à tout ça... :(

Bonne soirée !
Merci pour tout !

thm
REGULIER
REGULIER
Messages : 97
Inscription : 17 juin 2005 15:45

Re: OpenOCD compatible Vista + tms470 ? (newbie)

Message par thm »

Bonjour, Bunn

Tout d'abord pour tes questions sur Openocd, l y a l'excellent tuto de JP sur ce site. (bien que la version d'OpenOcd soit un peu dépasséé).
et tout est aussi sur le wiki openocd : http://openfacts.berlios.de/index-en.ph ... p_Debugger que je te conseille de bien lire; tu comprendras alors les différents fichiers .cfg , . script et commandes.

Pour ton deuxième post, je ne peux que te conseiller de lire un ouvrage sur le C (et en particulier sur le préprocesseur cpp), l'emploi des directives #define , #ifdef, #endif ,... doit y être décrit, c'est assez classique.
Par exemple #ifdef __IAR_SYSTEMS_ICC__ veut dire que le code qui suit (jusque #endif) sera pris en compte (par le préprocesseur cpp) si il y a eu quelque part dans le code #define __IAR_SYSTEMS_ICC__ ou qu'il a été défini par une option style -D __IAR_SYSTEMS_ICC__ dans l'invocation de gcc.

Quant à ce genre de déclaration,

Code : Tout sélectionner

#define __IO_REG8(NAME, ADDRESS, ATTRIBUTE) \
volatile __no_init ATTRIBUTE unsigned char NAME @ ADDRESS
cela s'appelle une macro. Le backslash signifie simplement qu'elle continue à la ligne suivante.
ATTENTION, le backslash doit être suivi d'une caractère blanc (espace)
Quand tu écriras dans ton code

Code : Tout sélectionner

 __IO_REG8(toto, 0xffff, far); 
cela sera remplacé par

Code : Tout sélectionner

volatile  __no_init far unsigned char toto @ 0xffff ; 
par le préprocesseur cpp.

Je m'étonne aussi de ton code

Code : Tout sélectionner

#define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT) \
volatile __no_init ATTRIBUTE union
{
unsigned char NAME;
BIT_STRUCT NAME ## _bit; \
} @ ADDRESS
qui devrait avoir des backslash :

Code : Tout sélectionner

define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)  \
volatile __no_init ATTRIBUTE union                          \
{                                                           \
unsigned char NAME;                                         \
BIT_STRUCT NAME ## _bit;                                    \
} @ ADDRESS
Ce qui me fait aussi dire que si tu as une erreur à chaque instruction __IO_REG32_BIT(SMCR0, 0xfffffd00,__READ_WRITE,__smcr0_bits);
C'est que tu as du "zapper" la définition d'une macro " #define __IO_REG32_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)

Thierry

thm
REGULIER
REGULIER
Messages : 97
Inscription : 17 juin 2005 15:45

Re: OpenOCD compatible Vista + tms470 ? (newbie)

Message par thm »

J'oubliais de répondre à 2 questions :

Si tu trouves qu'une sonde Jtag est trop chère, construits le Wiggler de JP décrit sur ce site. Mais attention, le wiggler port parallèle n'est supporté que jusqu'à la version 520 (voir www.yagarto.de).

Quand à au makefile, tu devras probablement en écrire un, mais en général, on en prend un tout fait d'un exemple que l'on modifie selon ses besoins.
Avec Eclipse, ce n'est pas nécessaire, les projets du type "managed make" génèrent automatiquement les makefile.

thierry

bunn_rath
NOUVEAU
NOUVEAU
Messages : 13
Inscription : 29 mai 2008 15:40

Re: OpenOCD compatible Vista + tms470 ? (newbie)

Message par bunn_rath »

Bonjour Thierry,

Merci de m'avoir répondu ! :-D
1. Les instructions sur le préprocesseur #ifndef ... je connaissais à peu près...
Ce que je ne comprenais pas bien c'est à quel moment était defini "__IAR_SYSTEMS_ICC__ ", "_SYSTEM_BUILD","__TID__" par exemples.
Est-ce que c'est au moment de lancer la commande de compilation ? Ou alors, il me manque une partie du code.
2. Dans l'instruction suivante "volatile __no_init far unsigned char toto @ 0xffff ;"
Que signifie __no_init et @ ? Est-ce que ce sont des mots réservés en C ? Je ne pense pas... Or dans les différents fichiers que j'ai récupérés il n'y a aucune définition de __no_init et de @.
3. "Ce qui me fait aussi dire que si tu as une erreur à chaque instruction __IO_REG32_BIT(SMCR0, 0xfffffd00,__READ_WRITE,__smcr0_bits);
C'est que tu as du "zapper" la définition d'une macro " #define __IO_REG32_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)"


Je n'ai pas "zapper" la définition de la macro " #define __IO_REG32_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)". La définition de cette macro est du même style que "#define __IO_REG8_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)" c'est seulement que c'est du "unsigned long" (car registres de 32 bits) au lieu de "unsigned char" (registres de 8 bits).
4. Comme j'ai l'impression que le code que j'ai récuppéré à l'adresse http://www.arm-development.com/tms470 est uniquement réservé au compilateur de IAR, j'ai tenté de réécrire mon propre code en m'inspirant des exemples de WinARM pour les micros AT91SAM7s64.h, lpc210_gnuarm.h.
Et comme tu t'en doutes, ça ne marche pas encore comme prévu... :cry:
Pourrais-tu me donner ton adresse mail pour que je t'envoie le code afin que tu y jettes un oeil ? Le code est assez long mais c'est assez répétitif.
5. Est-ce que tu pourrais également me dire ce que fait cette suite de code :
#define __REG32 volatile unsigned long

typedef struct {
__REG32 PENABLE :1;
__REG32 CLKDIV :4;
__REG32 :27;
} __pcr_bits;

#define PCR ((__pcr_bits *)0xfffffd30)

Ce que je comprends c'est :
a) que je crée une structure qui s'appelle __pcr_bits qui possède 2 variables PENABLE, CLKDIV de type volatile unsigned long.
b) PCR équivalent à création d'un pointeur de type __pcr_bits de nom 0xfffffd30
c) ":1", ":4", ":27" c'est la structure du registre PCR. PCR fait 32 bits PENABLE occupe 1 bit, CLKDIV occupe 4 bits, et les 27 autres sont réservés.

Ce que je ne comprends pas c'est pourquoi PENABLE et CLKDIV sont de type unsigned long.
Normalement on devrait crée un pointeur (__pcr_bits) qui pointe à l'adresse 0xfffffd30 et non un pointeur de nom 0xfffffd30.

Ensuite j'ai une erreur à la compilation quand j'ai l'instruction suivante : PCR = CLKDIV_1 sachant que
#define CLKDIV_1 ((unsigned int) 0x0 << 1)
donc PCR = CLKDIV_1 <=> ((__pcr_bits *)0xfffffd30) = ((unsigned int) 0x0 << 1);
L'erreur vient surement du fait d'une part que les types sont différents, et que ça devrait plutôt être :
*((__pcr_bits *)0xfffffd30) = ((unsigned int) 0x0 << 1);
Mais en changeant le code j'ai toujours une erreur à la compilation.
J'espère que je ne t'ai pas trop saoulé :roll: :oops:
J'espère que je me suis fait comprendre aussi...

Bref, je patauge en ce moment (remarque : c'est depuis le début que je patauge) et c'est que du bonheur ! :-D

Merci, aligato, thank you, danke schön... !

@+
Bunn

thm
REGULIER
REGULIER
Messages : 97
Inscription : 17 juin 2005 15:45

Re: OpenOCD compatible Vista + tms470 ? (newbie)

Message par thm »

De la bonne lecture :

http://gcc.gnu.org/onlinedocs/

et
http://oreilly.com/catalog/9780596006976/

Cela devrait résoudre tous tes problèmes présents et futurs.

Thierry

bunn_rath
NOUVEAU
NOUVEAU
Messages : 13
Inscription : 29 mai 2008 15:40

Re: OpenOCD compatible Vista + tms470 ? (newbie)

Message par bunn_rath »

Bonjour tout le monde,

Ca fait un bail !

J'ai un peu avancé. J'en suis au flashage de la carte avec OpenOCD. Et je rencontre quelques problèmes :

_ j'ai des messages d'erreur qui m'indique que "sector was locked", "TMS470 could not erase flash sector"...
_ Un autre message d'erreur dont je ne comprends la signification : arm7_9_common.c:581 arm7_9execute_sys_speed() : timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: 10.

Pour le premier message d'erreur, j'ai tenté de résoudre le problème de différentes façons :
_ j'ai voulu utiliser les lignes de commande suivantes dans le *.cfg : flash protect pour enlever la protection en effacement écriture des sectors, flash erase_sector. Sans résultat concluant car j'obtiens les messages suivants : command protect not found, command erace_sector not found.

_ ensuite j'ai regardé dans la datasheet de la TMS470. Il y a des registres à configurer pour choisir l'emplacement de la mémoire flash et pour permettre l'effacement, l'écriture des sectors. J'ai voulu modifier ces différents registres dans le fichier assembleur *.s qui sert à initialiser l'environnement (vecteurs). Est-ce que c'est bien là qu'il faut que je place mon code ?
Voici le code (les paragraphes 2 et 3 ne passent pas à la compilation erreur au niveau de 0xffffe00, 0xffff0000, 0xfffffe04, 0xffff0384) :


.set GLBCTRL, 0xffffffdc // autorise l ecriture dans registres flash
.set MFBALR0, 0xfffffe04 // genere memoire static
.set MFBAHR0, 0xfffffe00 // genere memoire static

// Memory Fine Base Address High Register 0
// ldr r0,=MFBAHR0 //
// mov r1,#0xfffffe00 //
// and r0,r0,#0xffff0000 // 0000 => base address
// str r0,[r1] //

// Memory Fine Base Address Low Register 0
// ldr r0,=MFBALR0 //
// mov r1,#0xfffffe04 //
// and r0,r0,#0xffff0384 // 03 => base address 22 bits, 8 => block size 128k, 4
// str r0,[r1] //

// Voir doc System Module
ldr r0,=GLBCTRL // contenu de GLBCTRL dans r0
mov r1,#0xffffffdc // adresse de GLBCTRL dans r1
orr r0,r0,#0x00000010 //
str r0,[r1] // GLBCTRL4=1

Puis sinon y a des choses qui m'échappent au niveau de la config de la mémoire, pourquoi j'ai l'impression qu'on a besoin de le faire plusieurs fois ? (Dans le fichier *.ld (avec les différentes sections, memory), dans le fichier *.cfg.)

Voilà si quelqu'un pouvait répondre à mes interrogations et me donner d'autres infos ou idées, ça serait vraiment sympa !
Merci d'avance.

Bunn

Répondre