Skip to content

Commit 067f3f8

Browse files
committed
hal_parport: Do not write outputs, if not required
1 parent 7baecb6 commit 067f3f8

1 file changed

Lines changed: 27 additions & 17 deletions

File tree

src/hal/drivers/hal_parport.c

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ typedef struct {
136136
hal_u32_t reset_time; /* min ns between write and reset */
137137
hal_u32_t debug1, debug2;
138138
long long write_time;
139-
unsigned char outdata;
139+
unsigned short outdata;
140140
unsigned char reset_mask; /* reset flag for pin 2..9 */
141141
unsigned char reset_val; /* reset values for pin 2..9 */
142142
long long write_time_ctrl;
143-
unsigned char outdata_ctrl;
143+
unsigned short outdata_ctrl;
144144
unsigned char reset_mask_ctrl; /* reset flag for pin 1, 14, 16, 17 */
145145
unsigned char reset_val_ctrl; /* reset values for pin 1, 14, 16, 17 */
146146
struct hal_parport_t portdata;
@@ -366,7 +366,7 @@ static void read_port(void *arg, long period)
366366
static void reset_port(void *arg, long period) {
367367
parport_t *port = arg;
368368
long long deadline, reset_time_tsc;
369-
unsigned char outdata = (port->outdata&~port->reset_mask) ^ port->reset_val;
369+
unsigned char outdata = (unsigned char)((port->outdata&~port->reset_mask) ^ port->reset_val);
370370

371371
if(port->reset_time > period/4) port->reset_time = period/4;
372372
reset_time_tsc = ns2tsc(port->reset_time);
@@ -375,16 +375,17 @@ static void reset_port(void *arg, long period) {
375375
deadline = port->write_time + reset_time_tsc;
376376
while(rtapi_get_clocks() < deadline) {}
377377
rtapi_outb(outdata, port->base_addr);
378+
port->outdata = outdata;
378379
}
379380

380-
outdata = (port->outdata_ctrl&~port->reset_mask_ctrl)^port->reset_val_ctrl;
381+
outdata = (unsigned char)((port->outdata_ctrl&~port->reset_mask_ctrl)^port->reset_val_ctrl);
381382

382383
if(outdata != port->outdata_ctrl) {
383-
/* correct for hardware inverters on pins 1, 14, & 17 */
384-
outdata ^= 0x0B;
385384
deadline = port->write_time_ctrl + reset_time_tsc;
386385
while(rtapi_get_clocks() < deadline) {}
387-
rtapi_outb(outdata, port->base_addr + 2);
386+
/* correct for hardware inverters on pins 1, 14, & 17 */
387+
rtapi_outb(outdata ^ 0x0B, port->base_addr + 2);
388+
port->outdata_ctrl = outdata;
388389
}
389390
}
390391

@@ -416,12 +417,15 @@ static void write_port(void *arg, long period)
416417
}
417418
mask <<= 1;
418419
}
419-
/* write it to the hardware */
420-
rtapi_outb(outdata, port->base_addr);
421-
port->write_time = rtapi_get_clocks();
420+
if (outdata != port->outdata)
421+
{
422+
/* write it to the hardware */
423+
rtapi_outb(outdata, port->base_addr);
424+
port->write_time = rtapi_get_clocks();
425+
port->outdata = outdata;
426+
}
422427
port->reset_val = reset_val;
423428
port->reset_mask = reset_mask;
424-
port->outdata = outdata;
425429
/* prepare to build control port byte, with direction bit clear */
426430
outdata = 0x00;
427431
} else {
@@ -452,13 +456,15 @@ static void write_port(void *arg, long period)
452456
}
453457
port->reset_mask_ctrl = reset_mask;
454458
port->reset_val_ctrl = reset_val;
455-
port->outdata_ctrl = outdata;
456459
}
457-
/* correct for hardware inverters on pins 1, 14, & 17 */
458-
outdata ^= 0x0B;
459-
/* write it to the hardware */
460-
rtapi_outb(outdata, port->base_addr + 2);
461-
port->write_time_ctrl = rtapi_get_clocks();
460+
if (outdata != port->outdata_ctrl)
461+
{
462+
/* write it to the hardware */
463+
/* correct for hardware inverters on pins 1, 14, & 17 */
464+
rtapi_outb(outdata ^ 0x0B, port->base_addr + 2);
465+
port->write_time_ctrl = rtapi_get_clocks();
466+
port->outdata_ctrl = outdata;
467+
}
462468
}
463469

464470
void read_all(void *arg, long period)
@@ -598,6 +604,10 @@ static int pins_and_params(char *argv[])
598604
rtapi_outb(rtapi_inb(port_data_array[n].base_addr+2) | 0x20, port_data_array[n].base_addr+2);
599605
}
600606

607+
/* The first task execution should write all outdata. */
608+
port_data_array[n].outdata = 0xFF00;
609+
port_data_array[n].outdata_ctrl = 0xFF00;
610+
601611
/* export all vars */
602612
retval = export_port(n, &(port_data_array[n]));
603613
if (retval != 0) {

0 commit comments

Comments
 (0)