Saturday, September 16, 2006

La madre de los motorola

Hace un tiempo me tope con un buen integrado de la familia Coldfire de Freescale, el 5407, tengo 3 de estos integrados en mi caja de electonica, y no quice dejarlos llenar de polvo, me puse a la tarea de crear un sistema embebido con el integrado.
Como no sabia como funcionaba bien, me puse a investigar y cai en la familia 68 de la cual se basa la familia coldfire, y comence a diseñar un sistema completo basado en el 68000.
El sistema consta de:
1 Procesador MC68HC000FN16
2 Memorias SRAM de 128K c/u (D431000). 256K de Ram total.
2 Memorias EEPROM de 8K c/u (AT28C64B) . 64K de memoria para el "Bios" , Bootloader, como le quieran llamar.
1 Display de Cristal Liquido. Pa ver algo
8 Leds a modo de Post Code. Pa depurar.
2 Dip Switch. Uno a modo de entrada, y otro para seleccionar el numero de interrupcion.
2 Pulsadores, pa reset y pa generar una interrupcion.
1 74LS138. pa decodificar direcciones. los 16MB que direcciona el 68000 esta partido en 8.
Glue Logic:
Un monton de compuertas.
1 2n2222 todo bamba (por no poner un IC de negadores).

Mucho cable.
Condensadores (el tipico 104)
Resistencias.

Actualmente esta problematico, creo que hay algunos cables medio sueltos y es problematico pa que funcione, pero lo hace.
Fotos:

Listo, pa que corriera algo, la cosa es sencilla, primero tengo que tener el toolchain del 68K bien compilado (demas que luego digo como, es canson el proceso), y luego hacer un archivo .S donde hay un .init, y ahi un jump a el main de algun programa en C, y listo, hay van los archivos necesarios para que corra lo que tiene actualmente.

De primero la licencia de todo el codigo a continuacion:
Program test to 68000 processor.
Copyright (C) 2005 Jorge Eduardo Cardona Gaviria

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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.



---------------------------------- boot.S -----------------------------------

.extern start_main
.extern int_002,int_003
.extern int_004,int_005,int_006,int_007,int_008,int_009,int_010,int_011,int_012,int_013
.extern int_014,int_015,int_016,int_017,int_018,int_019,int_020,int_021,int_022,int_023
.extern int_024,int_025,int_026,int_027,int_028,int_029,int_030,int_031,int_032,int_033
.extern int_034,int_035,int_036,int_037,int_038,int_039,int_040,int_041,int_042,int_043
.extern int_044,int_045,int_046,int_047,int_048,int_049,int_050,int_051,int_052,int_053
.extern int_054,int_055,int_056,int_057,int_058,int_059,int_060,int_061,int_062,int_063
.extern int_064,int_065,int_066,int_067,int_068,int_069,int_070,int_071,int_072,int_073
.extern int_074,int_075,int_076,int_077,int_078,int_079,int_080,int_081,int_082,int_083
.extern int_084,int_085,int_086,int_087,int_088,int_089,int_090,int_091,int_092,int_093
.extern int_094,int_095,int_096,int_097,int_098,int_099,int_100,int_101,int_102,int_103
.extern int_104,int_105,int_106,int_107,int_108,int_109,int_110,int_111,int_112,int_113
.extern int_114,int_115,int_116,int_117,int_118,int_119,int_120,int_121,int_122,int_123
.extern int_124,int_125,int_126,int_127,int_128,int_129,int_130,int_131,int_132,int_133
.extern int_134,int_135,int_136,int_137,int_138,int_139,int_140,int_141,int_142,int_143
.extern int_144,int_145,int_146,int_147,int_148,int_149,int_150,int_151,int_152,int_153
.extern int_154,int_155,int_156,int_157,int_158,int_159,int_160,int_161,int_162,int_163
.extern int_164,int_165,int_166,int_167,int_168,int_169,int_170,int_171,int_172,int_173
.extern int_174,int_175,int_176,int_177,int_178,int_179,int_180,int_181,int_182,int_183
.extern int_184,int_185,int_186,int_187,int_188,int_189,int_190,int_191,int_192,int_193
.extern int_194,int_195,int_196,int_197,int_198,int_199,int_200,int_201,int_202,int_203
.extern int_204,int_205,int_206,int_207,int_208,int_209,int_210,int_211,int_212,int_213
.extern int_214,int_215,int_216,int_217,int_218,int_219,int_220,int_221,int_222,int_223
.extern int_224,int_225,int_226,int_227,int_228,int_229,int_230,int_231,int_232,int_233
.extern int_234,int_235,int_236,int_237,int_238,int_239,int_240,int_241,int_242,int_243
.extern int_244,int_245,int_246,int_247,int_248,int_249,int_250,int_251,int_252,int_253
.extern int_254,int_255
.global _start
.global _vectors
.text

_vectors:

.long 0x320000,0x400
.long int_002,int_003
.long int_004,int_005,int_006,int_007,int_008,int_009,int_010,int_011,int_012,int_013
.long int_014,int_015,int_016,int_017,int_018,int_019,int_020,int_021,int_022,int_023
.long int_024,int_025,int_026,int_027,int_028,int_029,int_030,int_031,int_032,int_033
.long int_034,int_035,int_036,int_037,int_038,int_039,int_040,int_041,int_042,int_043
.long int_044,int_045,int_046,int_047,int_048,int_049,int_050,int_051,int_052,int_053
.long int_054,int_055,int_056,int_057,int_058,int_059,int_060,int_061,int_062,int_063
.long int_064,int_065,int_066,int_067,int_068,int_069,int_070,int_071,int_072,int_073
.long int_074,int_075,int_076,int_077,int_078,int_079,int_080,int_081,int_082,int_083
.long int_084,int_085,int_086,int_087,int_088,int_089,int_090,int_091,int_092,int_093
.long int_094,int_095,int_096,int_097,int_098,int_099,int_100,int_101,int_102,int_103
.long int_104,int_105,int_106,int_107,int_108,int_109,int_110,int_111,int_112,int_113
.long int_114,int_115,int_116,int_117,int_118,int_119,int_120,int_121,int_122,int_123
.long int_124,int_125,int_126,int_127,int_128,int_129,int_130,int_131,int_132,int_133
.long int_134,int_135,int_136,int_137,int_138,int_139,int_140,int_141,int_142,int_143
.long int_144,int_145,int_146,int_147,int_148,int_149,int_150,int_151,int_152,int_153
.long int_154,int_155,int_156,int_157,int_158,int_159,int_160,int_161,int_162,int_163
.long int_164,int_165,int_166,int_167,int_168,int_169,int_170,int_171,int_172,int_173
.long int_174,int_175,int_176,int_177,int_178,int_179,int_180,int_181,int_182,int_183
.long int_184,int_185,int_186,int_187,int_188,int_189,int_190,int_191,int_192,int_193
.long int_194,int_195,int_196,int_197,int_198,int_199,int_200,int_201,int_202,int_203
.long int_204,int_205,int_206,int_207,int_208,int_209,int_210,int_211,int_212,int_213
.long int_214,int_215,int_216,int_217,int_218,int_219,int_220,int_221,int_222,int_223
.long int_224,int_225,int_226,int_227,int_228,int_229,int_230,int_231,int_232,int_233
.long int_234,int_235,int_236,int_237,int_238,int_239,int_240,int_241,int_242,int_243
.long int_244,int_245,int_246,int_247,int_248,int_249,int_250,int_251,int_252,int_253
.long int_254,int_255

_start:

move.l #0x00100000,%a0 /* Leds */

check_ram:
move.w #0x80,(%a0)
move.l #0x00300000,%a1


bucle1:
move.l %a1,(%a1)+
cmpa.l #0x00320000,%a1
blt bucle1


bucle2:
move.l -(%a1),%d0
cmp.l %a1,%d0
bne Error
cmpa.l #0x00300000,%a1
bgt bucle2

move.w #0xff,(%a0)


move.l #0x100000,%d1 /* contador de la duracion de encendido.*/

bucle3:
sub.l #0x1,%d1
bne bucle3

move.w #0x3c,(%a0)


movea.l #0x320000,%a7
movea.l #0x310000,%a6

jsr start_main
Error:

move.w #0x00,(%a0)

forever:
jmp forever
----------------------------------------------------------------------
--------------------------- main.c ---------------------------------
#include "main.h"

void start_main(void)
{
LEDS_set_byte(0);

bienvenida();

mensaje();

}
----------------------------------------------------------------
---------------------- main.h -------------------------------
#define LEDS_ADDRESS 0x00100000
#define DIP_ADDRESS 0x00200000
#define RAM_BASE_ADDRESS 0x00300000
#define RAM_USER_BASE_ADDRESS RAM_BASE_ADDRESS+SYSTEM_INFO_LENGHT
#define RAM_LENGHT 0x00020000
#define LCD_DATA_ADDRESS 0x00400000
#define LCD_CONTROL_ADDRESS 0x00400001

#define SYSTEM_INFO_LENGHT 0x00000002

#include "func.h"
#include "LCD.h"
#include "LEDS.h"
#include "DIP.h"
#include "Int.h"

struct _SYSTEM_INFO
{
unsigned char LEDS;
};



void start_main(void);
-------------------------------------------------------------------
--------------------------- LEDS.c ----------------------------
#include "LEDS.h"
#include "main.h"

void LEDS_set_byte(unsigned char dato)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;

info->LEDS=dato;

LEDS_REFRESH(LEDS);
}

void LEDS_set_bit(unsigned char bit)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;


bit=1<

info->LEDS |= bit;

LEDS_REFRESH(LEDS);
}

void LEDS_clear_bit(unsigned char bit)
{
unsigned char *LEDS = (unsigned char*) LEDS_ADDRESS;
struct _SYSTEM_INFO * info = (struct _SYSTEM_INFO *) RAM_BASE_ADDRESS;

bit=1<
info->LEDS &= ~bit;

LEDS_REFRESH(LEDS);

}
--------------------------------------------------------------------
-------------------------- LEDS.h ------------------------------
#define LEDS_REFRESH(x) *x=info->LEDS

void LEDS_set_byte(unsigned char dato);
void LEDS_set_bit(unsigned char bit);
void LEDS_clear_bit(unsigned char bit);
--------------------------------------------------------------------
--------------------------- func.c -------------------------------
#include "main.h"

inline void prueba(unsigned char a);


/* espera(1) = 3.27315uS */
void esperar(unsigned long n)
{
do{}while(--n>0);

}



void bienvenida(void)
{
unsigned char *LEDS = (unsigned char *) LEDS_ADDRESS;
unsigned int p,q,dummy0, dummy1;
unsigned char k,j,i;



for(k=0;k<2;k++)
{
i=1;
for(j=0;j<8;j++)
{
LEDS_set_byte(i);
esperar(24000);
}
i=128;
for(j=0;j<8;j++)
{
LEDS_set_byte(i);
esperar(24000);
i=i>>1;
}
}

for(k=0;k<4;k++)
{
for(j=0;j<8;j++)
{

LEDS_set_byte(0);
LEDS_set_bit(j);
LEDS_set_bit(7-j);
esperar(48000);
}
}

prueba(j);
LEDS_set_byte(j);

}

__inline__ void prueba(register unsigned char a)
{
register unsigned long d3 asm("d3") = (unsigned long) a;

asm("move.b %d3,-(%sp) \n"
"jbsr LEDS_set_byte");
LEDS_set_byte((unsigned char) d3);

}

void mensaje(void)
{
LCD_configurar();
LCD_configurar();
LCD_configurar();
LCD_configurar();
LCD_configurar();
do
{
LCD_escribir_cadena("MC68HC000FN16",100000);
LCD_posicion(0,1);
LCD_escribir_cadena("Microprocessor",100000);
LCD_limpiar();
LCD_regresar();
}while(1);


}

---------------------------------------------------------------
------------------------- func.h ----------------------------



void esperar(unsigned long n);
void bienvenida(void);
void mensaje(void);

----------------------------------------------------------------

hay mas archivos pero luego los subo que estan malucos de pegar, por ultimo el Makefile
------------------- Makefile -----------------------------
#Compilador,Linkeo y generacion del bin para C.

all:
m68k-elf-gcc -ggdb -Os -m68000 -mshort -c func.c
m68k-elf-gcc -Os -m68000 -mshort -c -S func.c

m68k-elf-gcc -ggdb -Os -m68000 -mshort -c main.c
m68k-elf-gcc -Os -m68000 -mshort -c -S main.c

m68k-elf-gcc -ggdb -O0 -m68000 -mshort -c LCD.c
m68k-elf-gcc -O0 -m68000 -mshort -c -S LCD.c

m68k-elf-gcc -ggdb -Os -m68000 -mshort -c Int.c
m68k-elf-gcc -Os -m68000 -mshort -c -S Int.c

m68k-elf-gcc -ggdb -Os -m68000 -mshort -c LEDS.c
m68k-elf-gcc -Os -m68000 -mshort -c -S LEDS.c

m68k-elf-gcc -ggdb -Os -m68000 -mshort -c DIP.c
m68k-elf-gcc -Os -m68000 -mshort -c -S DIP.c

m68k-elf-as -m68000 -o boot.o boot.S

m68k-elf-as -m68000 -o Int_e.o Int_e.S


#m68k-elf-ld -dp -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o /usr/m68k-elf/lib/gcc/m68k-elf/4.0.1/m68000/libgcc.a -o prueba.o
m68k-elf-ld -dp -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o -o prueba.e

#m68k-elf-ld -dp -ggdb -T ldscript boot.o Int_e.o main.o func.o LCD.o Int.o LEDS.o DIP.o -o prueba.gdb

m68k-elf-objcopy -O binary prueba.e prueba.bin

./split prueba.bin

clean:
rm *.s *.o *.bin*
-------------------------------------------------
------------------- ldscript -------------------
ENTRY(_vectors)
SECTIONS {.text 0x0000 : {*(.text)}}
-------------------------------------------------


Basicamente es todo.

TODO:
hacer un TODO completo.

No comments: