RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
4) De IPC@CHIP hardware. Hier geven we een beschrijving van de verschillende hardware-onderdelen van het RIOT bord en hun onderlinge samenhang. De belangrijkste componenten zijn: de IPC@CHIP SC12, een rudimentaire embedded Internet PC on chip, de IO processor en het dual port geheugen. De IPC@CHIP SC12 embedded controller. De IPC@CHIP van de firma Beck is een embedded controller ontworpen om producten te kunnen verbinden met het internet of een LAN. De IPC@CHIP is een combinatie van hardware en software. De hardware bestaat uit een 186-processor, RAM, FLASH-disk, twee seriële poorten, timers, IIC controller, ethernet controller, parallelle poort en een adres/databus . De grootte van het geheugen en de snelheid van de CPU hangt af van het type IPC@CHIP. Deze hardware is verpakt in een DIL32 behuizing, zie figuur 4.1.
Figuur 4.1: IPC@CHIP SC12
De software bestaat zoals wordt aangegeven in figuur 4.2 uit een Real Time Operating System (RTOS) met file system, TCP/IP stack, web server, FTP server, Telnet server en Hardware interface layer . Al deze services zijn voor user programma’s aanspreekbaar via Application Programmers Interfaces (API’s).
User DOS programma’s, uitgevoerd als tasks van het RTOS RTOS en Filesystem API RTOS, TCP/IP, Hardware,Webserver,CGI,Serial, Ethernet, I2C, DOS int21 TFTP server
DHCP Client
Ethernet Packet driver
FTP server
HTTP Web server
UDP Config server
Telnet server
Command shell
Socket Application Interface
DOS EXE
TCP/IP Stack ARP, ICMP, TCP, UDP, IGMP
Loader
PPP server
PPP Client
Figuur 4.2: IPC@Chip software architectuur
Versie 1.0
44
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
De software is pre-installed on-chip, de IPC@CHIP is dus gebruiksklaar bij verzending. Door deze strategie is dus een groot deel van de functionaliteit een onderdeel van het operating system. Alleen de toepassingsgebonden functionaliteit moet nog worden ontwikkeld als een userprogramma. De IPC@CHIP is dus ideaal om snel een nieuw product web-enabled op de markt te krijgen. Het RTOS kan 35 tasks, 15 timers, 60 semaforen, 10 message exchanges en 2 event groups aan. De user-programma’s worden geschreven als een 16 bit DOS toepassing. De RTOS kan tot 12 user-programma’s in RAM laden, waar iedere toepassing uitgevoerd wordt in een afzonderlijke task. Vanuit een user-programma kan men door gebruik te maken van software interrupts het RTOS aanspreken om tasks te creëren, TCP sockets te openen enz. Als programmeeromgeving kan een gewone BORLAND C/C++ compiler gebruikt worden. Een bijhorende source level debugger is vrij beschikbaar via de website http://www.bcl.de . De TCP/IP stack is een performante stack, zonder compromissen. Hij biedt TCP, UDP, ARP, ICMP, Socket interface, 64 Sockets en 3 device interfaces ( Ethernet, PPP server en PPP client). Deze TCP/IP stack is in het OS slechts beschikbaar vanaf de BIOS versie SC12Vxxx_MEDIUM. De versie van de BIOS software kan door de gebruiker zelf worden opgeladen in functie van zijn toepassing. Graag verwijzen we hiervoor naar de gedetailleerde 'Getting started' info van de firma Beck.
Overzicht van de IPC@CHIP. Technische gegevens: • • • • • • • • • • • • • • • •
80186 16 bit CPU. 20MHz clock. 512 Kbyte Flash ROM. 512 Kbyte RAM. 14 programmeerbare I/O (PIO) pinnen. 2 DMA kanalen. 2 seriële poorten. Ethernet controller IEE802.3 met geïntegreerde 10Base-T ontvanger. 3 programmeerbare 16 bit timers. PWM. Programmeerbare interruptcontroller met 6 externe en 8 interne interruptbronnen. Programmeerbare geheugen en I/O chip-select logica. Single 5V voedingsspanning. Watchdog timer. DIL32 behuizing. IIC Bus master
Versie 1.0
45
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
Pinout van de IPC@CHIP SC12.
Figuur 4.3: pinout van de IPC@CHIP.
Pin functies. VCC GND A[0..2] AD[0..7]
Voedingsspanning 5VDC Massa Address bus (tristate, synchroon) Address/Data bus (tristate,synchroon) Gemultiplexte addres en data bus voor de I/O-map. Geldig address bij dalende flank ALE. ALE Address Latch Enable (synchroon) Dalende flank geeft geldig address weer op AD[0..7] /RD Read signaal (synchroon, actief laag) Geeft lees actie aan in de I/O-map. /WR Write signaal (synchroon, actief laag) Geeft schrijf actie aan in de I/O-map PIO[0..13] Programmeerbare I/O pinnen (input,output, asynchroon,open drain) TPRX/TPTX Ethernet controller (10Base-T interface) RXD/TXD Seriële poorten. CTS/RTS RXD1/TXD1/CTS1/RTS1 COM poort. RXD0/TXD0/CTS0/RTS0 EXT poort. PCS[0..3] Peripheral chip selects (synchroon) PCS[5..6] Deze selecteren telkens een I/O bereik van 256 bytes. PCS4 wordt intern door door het OS gebruikt om de ethernetcontroller aan te spreken. INT[0,2..4] TMRIN/ TMROUT RESET I2CCLK I2CDAT
Versie 1.0
Maskable interrupt request (asynchroon). Timer input/ output. Resetpin voor de IPC@CHIP . Spanning onder 0.8V reset de chip. IIC bus clock. IIC bus data.
46
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
Gebruik van de ADDRESS/ DATA-bus. Bij het gebruik van de IPC@CHIP als processor zijn er twee mogelijkheden om het I/O adresbereik aan te spreken. De eerste mogelijkheid bestaat erin om over de adresbus A[0..2] en de pinnen PCS[0,2,3] (Programmable Chip Select 0,2,3) het volgende adresbereik te adresseren: Tabel 4.1: Beperkte adresseerbaarheid.
PCS (Programmable Chip Select)
AD[0..2]
PCS 0 PCS 2 PCS 3
00H-07H 200H-207H 300H-307H
Bij deze vorm van adresseren zijn de AD[0..7] pinnen datalijnen. Met de /RD en de /WR lijnen wordt er aangegeven of er in het I/O adresgebied gelezen of geschreven wordt. PCS [1,5,6] zijn door het gebruik van A[0..2] niet beschikbaar. Het nadeel van deze adressering is het kleine adresseringsgebied dat ter beschikking staat. Een tweede mogelijkheid is de adressering met behulp van de ALE (Address Latch Enable) lijn. Bij deze adresserings methode staat een veel groter adresbereik ter beschikking. Immers PCS[1..3] en PCS[5,6] staan nu ter beschikking. PCS0 wordt hier gebruikt als ALE lijn en is voor adressering niet beschikbaar. PCS4 wordt intern gebruikt voor de Ethernetcontroller. Tabel 4.2: Adresseerbaarheid via de ALE lijn.
PCS (Programmable Chip Select)
AD[0..7]
PCS1 (PIO4) PCS2 (/CTS1) PCS3 (/RTS1) PCS5 (PIO3) PCS6 (PIO2)
100H-1FFH 200H-2FFH 300H-3FFH 500H-5FFH 600H-6FFH
Bij de dalende flank van ALE staat op de AD[0..7] lijnen nu een geldig adres. Deze methode wordt op ons RIOT bord deels toegepast. Zie figuur 4.4. of het totaalschema in het technisch dossier. We spreken hier telkens het adresbereik 100H tot 1FFH aan, wat als gevolg heeft dat de PCS1 lijn wordt geactiveerd, wat blijkt uit tabel 4.2. PCS1 wordt gebruikt als Chip Enable lijn van de DPRAM, d.w.z. dat de DPRAM vanuit de software alleen maar aangesproken wordt bij het adresbereik 100H tot 1FFH (we spreken dus maximaal 256 bytes aan van de voorziene 1Kbyte)! De pinnen PCS2 (/CTS1) en PCS3 (/RTS1) worden op het RIOT bord hardwarematig reeds gebruikt met hun alternatieve functies als handshake signalen van de seriële poort1, we kunnen ze dus niet meer gebruiken als Chip Select pin voor externe componenten op de bus. We gebruiken nu de pinnen PCS5 en PCS6 met hun alternatieve functie nl. als gewone parallelle IO pinnen PIO3 en PIO2, en verbinden deze met de adreslijnen A9 en A8 van de DPRAM. Bij elke mogelijke digitale combinatie (A9,A8) die we hiermee onder softwarecontrole kunnen aanbieden aan de DPRAM kunnen we nu het bereik van 100H tot 1FFH op de adres/databus aanspreken. Maar telkens bij een andere geheugenbank aangegeven met A8 en A9, wat resulteert in vier maal een 256byte bereik.
Versie 1.0
47
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
Op deze manier is het geheugenbereik van 1Kbyte van de Dual Port RAM (DPRAM) aanspreekbaar. De op RIOT gebruikte DPRAM circuits zijn afgebeeld in figuur 4.5. Het timing diagramma van figuur 4.6 geeft de relatie aan tussen de verschillende signalen die betrokken zijn bij een bus-acces. De DPRAM vormt de interface naar de IO-processor ('IOsys'), en werkt als een mailbox geheugencomponent waarin langs de IPC@CHIP zijde als langs de IOprocessor('IOsys') zijde informatie kan worden geschreven en gelezen. De IO-processor 'IOsys' is een voorgeprogrammeerde microcontroller en heeft immers geen businterface waarmee hij met de IPC@CHIP kan worden verbonden, maar wel een adres/databus waarmee hij oa. geheugencomponenten kan aanspreken. In de DPRAM kunnen door de IPC@CHIP op welomschreven locaties parameters worden geschreven die door de IO-controller worden gelezen en zo de werking van deze laatste beïnvloeden. Op deze manier krijgen we een krachtige 'intelligente' periferiechip die verschillende taken zelfstandig kan uitvoeren zonder de IPC@CHIP processor hiermee lastig te vallen.
IPC@CHIP SC12
AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 PIO2 PIO3 PIO4 /RD /WR ALE
AD0-AD7 Dit is de adres/databus die extern sheet:3/2A door een 74HC573 wordt gedemultiplexed tot een 8bit adresbus en een 8bit databus door middel van het ALE controlesignaal. PIO2 en PIO3 worden bij het aanspreken van de DPRAM gebruikt als de meest PIO2-PIO4 beduidende adresbits A8 en A9. sheet:3/1A PIO4 wordt gebruikt als chip enable /CE van de DPRAM. CONTROL /RD en /WR worden gebruikt sheet:3/1A om de /OE en de R/W lijn aan te spreken van de DPRAM.
Figuur 4.4: De IPC@CHIP businterface naar DPRAM
Figuur 4.5: De op RIOT gebruikte DPRAM circuits
Versie 1.0
48
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
Figuur 4.6: Timingdiagramma van een buscyclus. In de command interpreter COMMAND staan er DOS-achtige commando’s ter beschikking voor de adressering met ALE. ALE 1 PCS 1 OB 100 FF IB 105
Activering van de adres/data bus. I/O bereik 100H-1FFH. De waarde FF wordt in de I/O locatie 100H geschreven. Het adres 105H wordt gelezen.
Deze commando’s staan ook via API’s ter beschikking van de programmeur van user programma’s zodat softwarematig de bus-mode kan worden ingesteld zoals wordt weergegeven in het volgende programma voorbeeld. Deze bus-mode (PCS1) wordt op het RIOT bord gebruikt, om de Dual Port Ram te kunnen aanspreken. Het volgende voorbeeld kan een en ander verduidelijken.
Versie 1.0
49
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
/******************************************************************************/ // Example of using the RIOT board v1.1 // // Created by [dp] 23.02.2002 // This program reads the contents of memory bank 0 of the dual port ram // on the RIOT board, and writes it to stdio. // It can be used to debug the memory hardware of the RIOT board by verifying the // external address/data bus and the control signals /RD,/WR,PCS1, PIO2,PIO3 of the // IPC@CHIP SC12 device on an oscilloscoop or logic analyser. // /******************************************************************************/ // includes #pragma option -1 #include <stdio.h> #include <dos.h>
//create 80186 code
// defines #define PFE_INT #define HAL_INT #define TCP_INT
0xa2 0xa1 0xac
// Pin Function Enabler // Hardware Abstraction Layer software interrupt
// variables union union struct
REGS inregs; REGS outregs; SREGS segregs;
// initialise RIOT v1.1 /******************************************************************************/ // enable the databus on the IPC@CHIP (ALE signal, PCS1 activates 100H-1FFH addresses) /******************************************************************************/ void enable_databus (void) { // enable 8 bit databus inregs.x.ax = 0x8001; //enable ALE, databus inregs.x.dx = 0x00ff; //all 8 bits are enabled int86x (PFE_INT,&inregs,&outregs,&segregs); //enable chip select 1 (PIO4) inregs.h.ah inregs.x.dx int86x
= 0x83; = 0x02; //PCS1# (100h-1ffh) (PFE_INT,&inregs,&outregs,&segregs);
//software interrupt (OS call)
}
Versie 1.0
50
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
/******************************************************************************/ // bank select 0 PIO2,PIO3 (A8,A9)=00b /******************************************************************************/ void select_bank0 (void) { // reset pio2,pio3 lines inregs.h.ah inregs.h.al inregs.x.dx int86x
= 0x82; = 0x05; //pio2,pio3 both 0 = 0x000b; //enable pio2,pio3 (PFE_INT,&inregs,&outregs,&segregs);
} /******************************************************************************/ // bank select 1 PIO2,PIO3 (A8,A9)=10b /******************************************************************************/ void select_bank1 (void) { // reset pio3 line inregs.h.ah = 0x82; inregs.h.al = 0x05; //pio3 0 inregs.x.dx = 0x0008; //enable pio3 int86x (PFE_INT,&inregs,&outregs,&segregs); // set pio2 line inregs.h.ah = 0x82; inregs.h.al = 0x04; //pio3 0 inregs.x.dx = 0x0004; //enable pio3 int86x (PFE_INT,&inregs,&outregs,&segregs); } /******************************************************************************/ // bank select 2 PIO2,PIO3 (A8,A9)=01b /******************************************************************************/ void select_bank2 (void) { // set pio3 line inregs.h.ah = 0x82; inregs.h.al = 0x04; //pio3 state1 inregs.x.dx = 0x0008; //enable pio3 int86x (PFE_INT,&inregs,&outregs,&segregs); // reset pio2 line inregs.h.ah = 0x82; inregs.h.al = 0x05; //pio2 0 inregs.x.dx = 0x0004; //enable pio2 int86x (PFE_INT,&inregs,&outregs,&segregs); }
Versie 1.0
51
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
/******************************************************************************/ // bank select 3 PIO2,PIO3 (A8,A9)=11b /******************************************************************************/ void select_bank3 (void) { // set pio2,pio3 lines inregs.h.ah inregs.h.al inregs.x.dx int86x
= 0x82; = 0x04; //pio2,pio3 both 1 = 0x000b; //enable pio2,pio3 (PFE_INT,&inregs,&outregs,&segregs);
} /******************************************************************************/ // Read databus on specified address /******************************************************************************/ unsigned char read_databus (unsigned int ram_address) { unsigned char value; // read data bus inregs.h.ah = 0x80; inregs.x.di = ram_address; // address= user parameter inregs.x.bx = 0xffff; //wAND=0xffff inregs.x.cx = 0x0000; //wXOR=0x0000 int86x (HAL_INT,&inregs,&outregs,&segregs); value = outregs.h.al; returnvalue; } /******************************************************************************/ // Write databus on specified address /******************************************************************************/ void write_databus (unsigned char value, unsigned int ram_address) { // Write data bus inregs.h.ah = 0x81; inregs.x.di = ram_address; // address= user parameter inregs.h.dh = 0; inregs.h.dl = value; inregs.x.bx = 0xff; //wAND= 8 bit databus inregs.x.cx = 0x0000; //wXOR=0x0000 int86x (HAL_INT,&inregs,&outregs,&segregs); }
Versie 1.0
52
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
/******************************************************************************/ // select memory bank 0, and repeatedly dump a 256 byte block on screen /******************************************************************************/ void main (void) { while (1) { unsigned char number; unsigned int address; void enable_databus (void); //setup address/databus ALE, PCS1 void select_bank0 (void); //select the memory bank to read for (address=0x100; address<=0x1ff; address++) { number= read_databus (address); //read riot dual port ram on address 100-1ffh printf ("\r\nData: %02Xh, Address: %02Xh",number,address); // display memory location } } }
Aan de hand van de functie enable_databus wordt via een operating system call (PFE-API) de ALE pinfunctie en de PCS1 pin geënabled, zodat bij het aanspreken van een adres in het bereik 100H-1FFH de ALE en PCS1 pinnen actief worden. De functie select_bank0 heeft als gevolg dat, de pinnen PIO2,PIO3 op het '00'b niveau worden geplaatst, en dus dat geheugenbank 0 wordt aangesproken. De functie read_databus leest de geheugenlocatie op het aangegeven adres. Daarna wordt deze data in een blok van 256 bytes op het scherm afgedrukt a.d.h.v. een for lus. Om de voorbeeldprogramma's beter te begrijpen is het nuttig de informatie van de firma Beck te raadplegen die handelt over de verschillende API's die ter beschikking staan van de gebruiker.
Versie 1.0
53
[dp] D. Pauwels
RIOT
Remote Internet Operated Terminal . Gebruikers handleiding v1.0
De MEMORY- en I/O MAP van de IPC@CHIP .
Figuur 4.7: Geheugen structuur van de IPC@CHIP. De firmware in Flash-ROM is steeds herprogrammeerbaar met de meest recente BIOS versie die downloadbaar is via de website van de firma BECK. In het RAM geheugen wordt het uit te voeren programma geladen (vanuit de Flash-Disk, en door het OS). Hierin is ook het gebruik van een RAM-disk mogelijk vanuit user programma’s. Zie figuur 4.7. In het 64Kbyte grote I/O gebied merkt men dat er naast de user-inschakelbare chip-selectlijnen (waarvan wij op het RIOT bord PCS1 gebruiken) met een adresgebied van 0000h tot 06FFh, ook het gebied van FF00h tot FFFFh aanspreekbaar is. Dit zijn de in de 80186 beschikbare controle-registers langs waar men de on-chip resources (hardware componenten) direct kan aanspreken. Dit is echter voor een aantal periferie componenten niet nodig daar ze ook door API’s ondersteund worden vanuit het OS. Op deze manier hoeft de gebruiker zich geen zorgen te maken over de specifieke werking van deze door API’s ondersteunde hardware onderdelen. De gebruiker kan echter voor specifieke gevallen of voor de door API's niet ondersteunde hardwarecomponenten deze hier direct aanspreken en initialiseren. Voor de gedetailleerde beschrijving van de in de 80186 beschikbare periferie componenten, en hun werking verwijzen we graag naar de 80186 USERS MANUAL.
Versie 1.0
54
[dp] D. Pauwels