@@ -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)
366366static 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
464470void 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