/**********************************************************************
 *****  INCLUDE FILE FOR HW DEFINITION IN CORE LIBRARY	          *****
 *****  (WARNING: do not change variable names				      *****
 *****                                                            *****
 *****  Name: core_lib.h                                          *****
 *****  Desc: hardware layer definitions					      *****
 *****  Ver.: 1.0                                                 *****
 *****  Date: 01/2011		                                      *****
 *****  Auth: Martin Mechacek		                              *****
 *****  Comp: ESTELAR s.r.o.									  *****
 *****                                                            *****
 *****  Copyright ESTELAR s.r.o. (c) 2010, all rights reserved    *****
 **********************************************************************/ 

#ifndef _DEF_DH485_H
#define _DEF_DH485_H

/////////////////////// IMPORTANT /////////////////////////////////////
/////  Your project must be compiled with define: CORE_DH485  /////////	
/////  														  /////////	
/////  unit: DH485	 										  /////////	
/////  desc: prevodnik RS485/LAN - na HW standartniho DH485	  /////////	



/**********************************************************************
 *****  IMPLEMENTATION AREA							 			   ****
 *****  set specification according to your hardware		       ****
 *********************************************************************/ 


//========================================================================
//>> define hw pin access
struct _st_io {                                          /* struct IO    */
             union {                                    
                   unsigned char BYTE;                  /*  Byte Access */
                   struct {                             /*  Bit  Access */
                          unsigned char B7:1;           /*    Bit 7     */
                          unsigned char B6:1;           /*    Bit 6     */
                          unsigned char B5:1;           /*    Bit 5     */
                          unsigned char B4:1;           /*    Bit 4     */
                          unsigned char B3:1;           /*    Bit 3     */
                          unsigned char B2:1;           /*    Bit 2     */
                          unsigned char B1:1;           /*    Bit 1     */
                          unsigned char B0:1;           /*    Bit 0     */
                          }      BIT;                   /*              */
                   }         	_P_;                    /*              */
};                                                      /*              */
#define _P7DR (*(volatile struct _st_io *) 0xFFFFD6) // Port 7 data register

#define _PADDR (*(volatile unsigned char *) 0xFEE009) // Port A data direction register
#define _PADR (*(volatile unsigned char *) 0xFFFFD9) // Port A data register
#define _PBDR (*(volatile unsigned char *) 0xFFFFDA) // Port B data register
#define _PX0 	0x01
#define _PX1		0x02
#define _PX2 	0x04
#define _PX3 	0x08
#define _PX4 	0x10
#define _PX5 	0x20
#define _PX6 	0x40
#define _PX7 	0x80

// define RS485 bus connections
// vysilani dat na sbernici probiha pouze aktivaci budice RS485
// vystup TxD je trvale v '0'
   #define RS485_DRIVER_TX_LO	  _PBDR &= ~_PX6		   	// nastavuje '0' na pin TxD - PB6(TXD2)

// pin VRXD slouzi pro zpetny odposlech stavu sbernice pro vyhodnoceni kolize
  #define VRXD 				  _P7DR._P_.BIT.B1				// definice pinu VRXD - musi byt fyzicky propojen na RxD - P71
  														// je take propojen na IRQ0

// data se vysilaji pomoci signalu DE
// pokud DE=1 na sbernici se zapisuje 0 a opacne, v klidu je nastaven na Lo
  #define SET_VTXD(data) 	_PADDR|= _PX3;if(data) _PADR|=_PX3; else _PADR&=~_PX3		// nastavuje hodnotu na pin DE - PA3


//========================================================================
//>> BUS_BAUDRATE 
// 19 200 bd serial constant definifion
// konstanty BUS_FREE_TIMEOUT, BUS_WAIT_TIMEOUT jsou definovany podle rychlosti volani BusTimer()
// ostatni se musi presne odmerit osciloskopem podle rychlosti procesoru, mista pro mereni jsou oznacena ve funkci BusPutChar
//------------------------------------------------------------------------

  #define 	BUS_BAUDRATE    	19200	// prenosova rychlost na sbernici	
  #define	BUS_FREE_TIMEOUT	3		// 5 ms - pokud trva klid na lince tuto dobu, bude nastaven priznak BUS_FREE (cca 10 znaku) - !! v praxi namereno 10 ms ??
  #define	BUS_WAIT_TIMEOUT	15		// doba cekani na nastaveni priznaku BUS_FREE (5x BUS_FREE_TIMEOUT)

  #define 	PERIOD10us			25		// konstanta pro dobu aktivace driveru RS485 - 10 us - hodnota neni kriticka
  #define 	BITPERIOD   		179		// konstanta pro dobu trvani jednoho bitu - 50us
  #define 	BITPERIOD1   		67		// doba trvani jednoho bitu - pokud se zapisuje jednicka ve smycce je vice instrukci proto je kratsi)
										// pro rychlost 19200 je ve smycce vlozena instrukce NOP pro dosazeni presneho casovani 
										// hodnota je svazana s PERIOD10us, presne nastaveni je mozne doladit zmenou PERIOD10us (+-1)
// pro rychlost 19200 je doba prenosu 1 byte 468us
// prodleva mezi jednotlivymi byty je cca 20us - pokud je procesor prilis rychly vlozi se prodleva 
  #define 	BYTEMARKER   		60		// doplneni prodlevy - 60
	
//<< end of BUS_BAUDRATE


//========================================================================
//>> define interrupts controll

#define _SCR2 (*(volatile unsigned char *) 0xFFFFC2) // SCI serial control register channel 2
#define _SSR2 (*(volatile unsigned char *) 0xFFFFC4) // SCI serial status register channel 2
#define _RDR2 (*(volatile unsigned char *) 0xFFFFC5) // SCI receive data register channel 2
#define _IER (*(volatile unsigned char *) 0xFEE015) // Interrupt controller IRQ enable register
#define _ISR (*(volatile unsigned char *) 0xFEE016) // Interrupt controller IRQ status register

// define macros for sci interrupt enable/disable
#define RX_InterruptEnable		{  _SCR2 |= 0x40; }  	   			   // povol RX Interrupt
#define RX_InterruptDisable		{  _SCR2 &= ~0x40; }  		 		   // zakaz RX Interrupt
#define RX_ClearFlags			{  _SSR2 &= ~0x40; _RDR2; }   	 // vymazani prijijateho bytu a souvisejicich flagu

#define VRX_InterruptEnable		{  _IER |= _PX0; }  	   		   // povol VRX Interrupt - IRQ0
#define VRX_InterruptDisable	{  _IER &= ~_PX0; }   		   // zakaz VRX Interrupt - IRQ0
#define VRX_ClearFlags			{  _ISR &= ~_PX0; }		       // vymazani flagu IRQ0

#define ALL_InterruptDisable	{  asm ("ldc %0l,ccr"::"r"(0xC0)); }    // zakazat vsechna preruseni pro presne casovani odesilani na sbernici
#define ALL_InterruptEnable		{  asm ("ldc %0l,ccr"::"r"(0)); }   	// povolit vsechna preruseni pro presne casovani odesilani na sbernici

// maximalni delka celeho jednoho paketu pro prijem i odesilani
// pokud je prijat delsi paket, bude korektne obslouzen, ale data z neho nebudou zpracovana
// soucasne generuje chybu ERR_SCI_LONG do gData.SciState
// aplikace by mela odeslat chybovou zpravu
// dle nastavene hodnoty se alokuje potrebna pamet, proto je treba prihlednout k HW moznostem konkretniho zarizeni
#define MAX_MESSAGE_LEN			256-SYS_HEADER_LEN

// maximalni delka prijimaciho bufferu ve kterem se ukladaji 
// prijata data z linky nez se zpracuji jako pakety - co nejvice podle velikosti dostupne RAM
// touto hodnotou se maskuje, tedy musi to byt vzdy souvisla rada jednicek
#define RX_BUFF_SIZE			0x7ff		// 2048 bytes

/////// end of IMPLEMENTATION AREA ///////////////////////////////////*/

#endif 		// __DEF_DH485

