Wednesday, September 27, 2006

TODO

*Sistema Embebido con el 68K.
-hacer programador de las CPLD's de Cypress.
-diseñar MMU.
-diseñar modulo de audio.
-diseñar modulo de video.
-diseñar modulo RTC.
-integrar serial, video, audio, MMU, RTC, memoria, LEDS, DIPSWITCH, LCD,
-estudiar posibilidad de un medio masivo de almacenamiento.
-Buscar un SO facil de portar, ojala Pistachio.

*Sistema embebido con el 5407
*Sistema embebido con el 5485
*Estudiar posibilidad de portar Pistachio a los Coldfire, o saltar a un ARM.
*En base a lo anterior hacer un Pistachio distribuido.
*Hacer pruebas de rendimiento.

(Demas que falta algo, si algo lo agrego luego)

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.

Monday, September 11, 2006

Tesis

Dicen las malas lenguas que tengo que hacer tesis, y hasta el momento este va a ser mi proyecto, existe un uKernel llamado pistachio que lo han trabajado en Karlsruhe, la cosa es lograr hacer un pistachio distribuido que corra en varias maquinitas embebidas de un costo bien reducido.

Saturday, September 09, 2006

De primerazo

Obligado empienzo el blog, luego vere que le agrego.