首页 > 代码库 > QNX LPT Port Programming

QNX LPT Port Programming

#include <stdio.h> 
#include <unistd.h> /* for sleep() */ 
#include <stdint.h> /* for uintptr_t */ 
#include <hw/inout.h> /* for in*() and out*() functions */ 
#include <sys/neutrino.h> /* for ThreadCtl() */ 
#include <sys/mman.h> /* for mmap_device_io() */ 

/* The Neutrino IO port used here corresponds to a single register, which is 
* one byte long */ 
#define PORT_LENGTH 1 

/* The first parallel port usually starts at 0x378. Each parallel port is 
* three bytes wide. The first byte is the Data register, the second byte is 
* the Status register, the third byte is the Control register. */ 
#define DATA_ADDRESS 0x378 
#define CTRL_ADDRESS 0x37a 
/* bit 2 = printer initialisation (high to initialise) 
* bit 4 = hardware IRQ (high to enable) */ 
#define INIT_BIT 0x04 

#define LOW 0x00 
#define HIGH 0xFF 

#define MAX_COUNT 60 


/* ______________________________________________________________________ */ 
int 
main( ) 

int privity_err; 
uintptr_t ctrl_handle; 
uintptr_t data_handle; 
int count; 

/* Give this thread root permissions to access the hardware */ 
privity_err = ThreadCtl( _NTO_TCTL_IO, NULL ); 
if ( privity_err == -1 ) 

fprintf( stderr, "can‘t get root permissions\n" ); 
return -1; 


/* Get a handle to the parallel port‘s Control register */ 
ctrl_handle = mmap_device_io( PORT_LENGTH, CTRL_ADDRESS ); 
/* Get a handle to the parallel port‘s Data register */ 
data_handle = mmap_device_io( PORT_LENGTH, DATA_ADDRESS ); 

for ( count = 0; count < MAX_COUNT; count++ ) 
{
/* Output a byte of lows to the data lines */ 
out8( data_handle, LOW); 
out8( ctrl_handle, (LOW & 0x0f ) ); 
printf( "Low\n" ); 
sleep( 1 ); 

/* Output a byte of highs to the data lines */ 
out8( data_handle, HIGH ); 
out8( ctrl_handle, (HIGH & 0x0f )); 
printf( "High\n" ); 
sleep( 1 ); 


return 0;