ullihome.de

Ullihome.de

 
Um SD-OS kompatibel zu Ihrer Hardwareplattform zu machen können Sie recht einfach ein neues Target erstellen.
Dazu legen Sie im SD-OS ordner Arch einen neuen Ordner für ihr Target an.

Die Ordnerstruktur in arch ist:

architektur bsp: avr -> controllertyp bsp: atmega16 -> targetname bsp: stk500

In diesem Ordner sollten sich im eingfachsten Fall 3 Dateien befinden:

Das Makefile
platform.c
platform.h


Sie können diese 3 dateien von einer existierenden Architektur übernehmen und nach Ihren Bedürfnissen anpassen.

Weiterhin benötigen sie im ordner targets eine .in

.in

MCU = atmega162
ARCH = avr
F_CPU=4000000UL
Wie man im Beispiel sieht, müssen hier diese 3 Variablen veröffentlicht werden MCU spezifiziert hier den prozessor ARCH den ordnernamen der Architektur und F_CPU die Taktfrequenz des Prozessors eventuell können MCU und F_CPU Architekturabhängig weggelassen werden oder es sind je nach makefile der Architektur mehr Angaben notwendig.

platform.h



In der platform.h werden alle includefiles der Treiber gesammelt und entsprechende Definitionen für die Treiber. Sie wird auch von einigen Treibern eingebunden um an entsprechende Definitionen zu kommen.

Beispiel:
#ifndef _SDOS_PLATFORM_H
#define _SDOS_PLATFORM_H

#include "../../../HD44780.h"

#define HD44780_PORT PORTA /**< port for the LCD lines */
#define HD44780_DATA0_PORT HD44780_PORT /**< port for 4bit data bit 0 */
#define HD44780_DATA1_PORT HD44780_PORT /**< port for 4bit data bit 1 */
#define HD44780_DATA2_PORT HD44780_PORT /**< port for 4bit data bit 2 */
#define HD44780_DATA3_PORT HD44780_PORT /**< port for 4bit data bit 3 */
#define HD44780_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
#define HD44780_DATA1_PIN 1 /**< pin for 4bit data bit 1 */
#define HD44780_DATA2_PIN 2 /**< pin for 4bit data bit 2 */
#define HD44780_DATA3_PIN 3 /**< pin for 4bit data bit 3 */
#define HD44780_RS_PORT HD44780_PORT /**< port for RS line */
#define HD44780_RS_PIN 6 /**< pin for RS line */
#define HD44780_RW_PORT HD44780_PORT /**< port for RW line */
#define HD44780_RW_PIN 5 /**< pin for RW line */
#define HD44780_E_PORT HD44780_PORT /**< port for Enable line */
#define HD44780_E_PIN 4 /**< pin for Enable line */

#define HD44780_LINES 2 /**< number of visible lines of the display */
#define HD44780_DISP_LENGTH 16 /**< visibles characters per line of the display */
#define HD44780_LINE_LENGTH 0x40 /**< internal line length of the display */

#define TICKS_PER_MS 5 //200 us Tick

void _init_drivers(void);

#endif


in dieser platform.h wird nur der LCD Treiber für HD44780 kompatible Controller eingebunden und entsprecehnde Portdeklarationen gemacht.

platform.c



In der platform.c werden entsprecehnde Treiber geladen und platformabhängige Routinen ausgelagert.
#include 
#include "platform.h"
#include
#include
#include

//resets max823
void _watchdog_reset(void)
{
PORTB |= (1< usleep(1);
PORTB &= ~(1<}

#define TICK_TIME 0xff-13 //~200us bei 4 Mhz und Prescaler 64

void _init_drivers(void)
{
//Tick Timer Setup
TCNT0 = TICK_TIME;
TCCR0 |= (1< TIMSK |= (1 << TOIE0);
sei();
//Watchdog Output
DDRB |= (1< PORTB |= (1< settimer(_watchdog_reset,TICKS_PER_MS*100); //Reset Max 823 every 1/2 second
//LCD RW, ENABLE
DDRA=0xFF;
PORTA=(1< _load_driver(&LCDDriverFunctions);
stdout = fopen("/dev/lcd0",0);
_load_driver(&TCSBusDriverFunctions);
}

void _timer_tick(void * pvParameters);

ISR(SIG_OVERFLOW0)
{
TCNT0 = TICK_TIME;
_timer_tick(NULL);
}

In deisem Beispiel sieht man recht schön was man mit der platform.c anstellen sollte. Es muss immer die routine _init_drivers enthalten sein.
Zusätzlich sollte man einen Hardwaretimer möglichst auf 200us setzen und in der entsprecehnden Interrupt Service Routine _timer_tick(NULL) aufrufen.
Tut man das nicht kann man die sleep routinen nicht benutzen welche allerdings auch für viele Treiber benutzt werden die dann natürlich nicht mehr funktionieren...

Weiterhin kann man hier plattformspezifisches auslagern wie hier z.b. das resetten eines Watchdogs.
 
Flattr this