/* Simula un falso puerto de comunicaciones. */ #include "fake_com_port_intr.h" #include #include #include #include #include // PIT programming functions (imported from MaRTE.HAL) extern void marte__hal__pit__inicialize(uint16_t c0, uint16_t c1); //extern void marte__hal__pit__program_timer(char c); extern void marte__hal__pit__write_counter(uint16_t c0, uint16_t c1); // fake device status variables static volatile int cont=-1; static volatile int new_data_available = 0; static volatile char data_buffer = 0; static volatile int initialized=0; // internal thread that "receives" data periodically void *sensor_thread(void *arg) { const char *data = "This is a message from the communication port."; int data_length = strlen(data); int i, j; // lazo que se ejecuta periódicamente while (1) { // espera al próximo periodo sleep(2); if (initialized) { // arrive new data cont ++; data_buffer = data[cont%data_length]; new_data_available = 1; //printf("Port receive %dth byte %c\n", cont, data_buffer); // programa el timer hardware para que lance una interrupción // inmediatamente marte__hal__pit__inicialize(0, 0); marte__hal__pit__write_counter(0, 10); for(i=0; i<10000; i++) for(j=0; j<10000; j++) ; } } return NULL; } extern void fake_com_port_intr_outb(unsigned short port, char val) { pthread_t th_sensor; switch (port) { case FAKE_COM_PORT_CONTROL_REG: // initialize port initialized = 1; // stops PIT (just in case...) marte__hal__pit__inicialize(0, 0); // crea el thread "sensor_thread" a la máxima prioridad CHK( pthread_create (&th_sensor, NULL, sensor_thread, NULL) ); CHK( pthread_setschedprio(th_sensor, sched_get_priority_max(SCHED_FIFO)) ); break; default: // wrong port value: no effect printe("fake_com_port_outb: Error: wrong port %d\n", port); } } extern char fake_com_port_intr_inb(unsigned short port) { char ret; switch (port) { case FAKE_COM_PORT_DATA_REG: // return last received byte of data new_data_available = 0; ret = data_buffer; break; case FAKE_COM_PORT_CONTROL_REG: // new data available ? ret = new_data_available; break; default: // wrong port value printe("fake_com_port_inb: Error: wrong port %d\n", port); ret = 0; } return ret; }