summaryrefslogtreecommitdiff
path: root/2003/i/buzz/src/busp/busp.cc
diff options
context:
space:
mode:
Diffstat (limited to '2003/i/buzz/src/busp/busp.cc')
-rw-r--r--2003/i/buzz/src/busp/busp.cc25
1 files changed, 22 insertions, 3 deletions
diff --git a/2003/i/buzz/src/busp/busp.cc b/2003/i/buzz/src/busp/busp.cc
index 4c2b03e..0e90475 100644
--- a/2003/i/buzz/src/busp/busp.cc
+++ b/2003/i/buzz/src/busp/busp.cc
@@ -10,12 +10,18 @@
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
+#include <iostream> //Debug
#define BUSP_FILE "/dev/robotbusp"
+// Pointeur vers l'instance unique.
+Busp *Busp::m_instance = 0;
+
// Initialise le busp, open (), signal ().
Busp::Busp ()
{
+ // Sauvegarde le pointeur d'instance.
+ m_instance = this;
// Ouvre le périphérique.
m_fd = open (BUSP_FILE, O_RDONLY);
if (m_fd == -1)
@@ -44,27 +50,39 @@ Busp::~Busp ()
sigaction (SIGUSR1, &sa, 0);
// Ferme le périphérique.
close (m_fd);
+ // Efface le pointeur d'instance.
+ m_instance = 0;
}
// Active les interruptions.
void
Busp::sti (void)
{
- //ioctl (m_fd, PBUS_INTENABLE);
+ ioctl (m_fd, PBUS_INTENABLE);
}
// Désactive les interruptions.
void
Busp::cli (void)
{
- //ioctl (m_fd, PBUS_INTENABLE);
+ ioctl (m_fd, PBUS_INTDISABLE);
}
// Traite le signal envoyé par le kernel lors d'une interruption.
void
Busp::irq (int sig)
{
+ Busp &busp = Busp::getInstance ();
+ // Désactivation des interuptions automatique.
// Récupère le numéro d'intéruption.
+ struct pbus_io io;
+ ioctl (busp.m_fd, PBUS_INTREAD, &io);
+ cout << "irq " << (int) io.ints << endl;
+ // Sous-traite l'interruption.
+ if (io.ints & BuspIr::m_irqMask)
+ busp.m_ir.irq ();
+ // Active à nouveau.
+ busp.sti ();
}
// Ecrire sur le bus.
@@ -75,6 +93,7 @@ Busp::write (int addr, int data)
io.addr = addr;
io.data = data;
ioctl (m_fd, PBUS_WRITE, &io);
+ cout << "write " << addr << " " << data << endl;
}
// Lire sur le bus.
@@ -84,6 +103,6 @@ Busp::read (int addr)
struct pbus_io io;
io.addr = addr;
ioctl (m_fd, PBUS_READ, &io);
+ cout << "read " << addr << " = " << (int) io.data << endl;
return io.data;
}
-