Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <errno.h>
- #include <fcntl.h>
- #include <linux/parport.h>
- #include <linux/ppdev.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/ioctl.h>
- #include <sys/time.h>
- #include <time.h>
- #include <unistd.h>
- #include <stdint.h>
- #define PARDEV "/dev/parport0"
- enum {
- PPIDATA,
- PPICTRL,
- PPISTATUS
- };
- enum {
- PPI_READ=0,
- PPI_WRITE,
- PPI_SHADOWREAD
- };
- int ppi_shadow_access(int fd, int reg, unsigned char *v, unsigned char action);
- int ppi_set(int fd, int reg, int bit);
- int ppi_clr(int fd, int reg, int bit);
- int ppi_get(int fd, int reg, int bit);
- int ppi_toggle(int fd, int reg, int bit);
- int ppi_getall(int fd, int reg);
- int ppi_setall(int fd, int reg, int val);
- int ppi_open(char * port);
- void ppi_close(int fd);
- int par_pinStatus(int port);
- int par_pinWrite(int port, int data);
- #define DEBUG_LOG 0
- #define TRACE_LOG 1
- void debug_log(char *s, int t)
- {
- printf("\n%s",s);
- }
- #define PARALLEL_PORT_ADDR 0x378
- #define JP_SENSOR_PORT_ADDR (PARALLEL_PORT_ADDR + 2)
- #define JP_LOWPAPER_SENSOR_PORT (PARALLEL_PORT_ADDR + 1)
- #define JP_MOTOR_PORT_ADDR (PARALLEL_PORT_ADDR + 2)
- #define BIT(x) (1 << x)
- #define JP_SENSOR_CTRL_BIT BIT(2)
- #define JP_SENSOR_VALUE(x) (((x) & JP_SENSOR_CTRL_BIT) >> 2)
- #define JP_LOWPAPER_SENSOR_BIT BIT(3)
- #define JP_LOWPAPER_SENSOR_VALUE(x) (((x) & JP_LOWPAPER_SENSOR_BIT) >> 3)
- #define JP_MOTOR_CTRL_BIT BIT(0)
- #define JP_SENSOR_CLEAR 1
- #define JP_SENSOR_BLOCK 0
- #define JP_MOTOR_START 1
- #define JP_MOTOR_STOP 0
- #define OBSOLETE__IOW _IOW
- #define PPISDATA PPWDATA
- #define PPIGDATA PPRDATA
- #define PPISCTRL PPWCONTROL
- #define PPIGCTRL PPRCONTROL
- #define PPISSTATUS PPWSTATUS
- #define PPIGSTATUS PPRSTATUS
- #define PIN_INVERSE 0x80 /* flag for inverted pin in serbb */
- #define PIN_MASK 0x7f
- struct ppipins_t {
- int pin;
- int reg;
- int bit;
- int inverted;
- };
- struct ppipins_t ppipins[] = {
- { 1, PPICTRL, 0x01, 1 },
- { 2, PPIDATA, 0x01, 0 },
- { 3, PPIDATA, 0x02, 0 },
- { 4, PPIDATA, 0x04, 0 },
- { 5, PPIDATA, 0x08, 0 },
- { 6, PPIDATA, 0x10, 0 },
- { 7, PPIDATA, 0x20, 0 },
- { 8, PPIDATA, 0x40, 0 },
- { 9, PPIDATA, 0x80, 0 },
- { 10, PPISTATUS, 0x40, 0 },
- { 11, PPISTATUS, 0x80, 1 },
- { 12, PPISTATUS, 0x20, 0 },
- { 13, PPISTATUS, 0x10, 0 },
- { 14, PPICTRL, 0x02, 1 },
- { 15, PPISTATUS, 0x08, 0 },
- { 16, PPICTRL, 0x04, 0 },
- { 17, PPICTRL, 0x08, 1 }
- };
- #define ppi_claim(fd) \
- if (ioctl(fd, PPCLAIM) < 0) { \
- fprintf(stderr, "SYSTEM: Parallel Port: can't claim device: %s\n\n", \
- strerror(errno)); \
- close(fd); \
- exit(1); \
- }
- #define ppi_release(fd) \
- if (ioctl(fd, PPRELEASE) < 0) { \
- fprintf(stderr, "SYSTEM: Parallel Port: can't release device: %s\n\n", \
- strerror(errno)); \
- close(fd); \
- exit(1); \
- }
- int parallelFd = 0;
- int ppi_shadow_access(int fd, int reg, unsigned char *v, unsigned char action)
- {
- static unsigned char shadow[3];
- int shadow_num;
- int mode;
- unsigned long set, get;
- int rc = 0;
- char debugBuf[256] = { '\0' };
- switch (reg)
- {
- case PPIDATA: set = PPISDATA; get = PPIGDATA; shadow_num = 0; break;
- case PPICTRL: set = PPISCTRL; get = PPIGCTRL; shadow_num = 1; break;
- case PPISTATUS: set = PPISSTATUS; get = PPIGSTATUS; shadow_num = 2; break;
- default:
- memset(debugBuf,0,sizeof(debugBuf));
- sprintf(debugBuf, "SYSTEM: Parallel Port: avr_set(): invalid register=%d\n", reg);
- debug_log(debugBuf,DEBUG_LOG);
- return -1;
- break;
- }
- printf("ShadowAccess for : %d -- Action : %d --",reg,action);
- switch (action)
- {
- case PPI_SHADOWREAD:
- *v = shadow[shadow_num];
- break;
- case PPI_READ:
- mode = IEEE1284_MODE_ECP;
- rc = ioctl(fd, PPSETMODE, &mode);
- rc = ioctl(fd, get, v);
- shadow[shadow_num]=*v;
- break;
- case PPI_WRITE:
- printf("ppi_write");
- shadow[shadow_num]=*v;
- rc = ioctl(fd, set, v);
- break;
- }
- printf(" port Val : %02X - IOCTL ret : %d \n",*v,rc);
- return rc;
- }
- /*
- * get all bits of the specified register.
- */
- int ppi_getall(int fd, int reg)
- {
- unsigned char v;
- int rc;
- rc = ppi_shadow_access(fd, reg, &v, PPI_READ);
- if (rc)
- return -1;
- return v; /* v == bit */
- }
- /*
- * set all bits of the specified register to val.
- */
- int ppi_setall(int fd, int reg, int val)
- {
- unsigned char v;
- int rc;
- v = val;
- rc = ppi_shadow_access(fd, reg, &v, PPI_WRITE);
- if (rc)
- return -1;
- return 0;
- }
- int ppi_open(char * port)
- {
- int prallelFd = 0;
- unsigned char v;
- char debugBuf[256] = { '\0' };
- if(!prallelFd)
- {
- prallelFd = open(port, O_RDWR);
- if (prallelFd < 0)
- {
- memset(debugBuf,0,sizeof(debugBuf));
- sprintf(debugBuf, "SYSTEM: Parallel Port: can't open device \"%s\": %s", port, strerror(errno));
- debug_log(debugBuf,DEBUG_LOG);
- return prallelFd;
- }
- ppi_claim(prallelFd);
- ppi_shadow_access (prallelFd, PPIDATA, &v, PPI_READ);
- ppi_shadow_access (prallelFd, PPICTRL, &v, PPI_READ);
- ppi_shadow_access (prallelFd, PPISTATUS, &v, PPI_READ);
- }
- return prallelFd;
- }
- void ppi_close(int fd)
- {
- ppi_release(fd);
- close(fd);
- }
- int par_pinStatus(int port)
- {
- int16_t sensorValue=-1;
- char charBuf[128] = {'\0'};
- if(!parallelFd)
- return -1;
- switch(port)
- {
- case 0x378: //data
- port=PPIDATA;
- printf("\ndata");
- break;
- case 0x379: //status
- port=PPISTATUS;
- printf("\nstatus");
- break;
- case 0x37A: //control
- printf("\ncontrol");
- port=PPICTRL;
- break;
- default:
- port=PPISTATUS;
- break;
- }
- sensorValue = ppi_getall(parallelFd,port);
- return sensorValue;
- }
- int par_pinWrite( int data,int port)
- {
- int sensorValue=-1;
- char charBuf[128] = {'\0'};
- //int parallelFd=ppi_open(PARDEV);
- if(!parallelFd)
- return -1;
- switch(port)
- {
- case 0x378: //data
- port=PPIDATA;
- break;
- case 0x379: //status
- port=PPISTATUS;
- break;
- case 0x37A: //control
- port=PPICTRL;
- break;
- default:
- port=PPISTATUS;
- break;
- }
- sensorValue = ppi_setall(parallelFd, port,data);
- return sensorValue;
- }
- int16_t jp_readSensorVal(void)
- {
- static int16_t portValPrev = 0;
- int16_t portVal = 0;
- char charBuf[128] = {'\0'};
- par_pinWrite(par_pinStatus(JP_SENSOR_PORT_ADDR) | JP_SENSOR_CTRL_BIT, JP_MOTOR_PORT_ADDR);
- usleep(5000);// Delay to make sure the value is reflected in any up-coming read
- portVal = par_pinStatus(JP_SENSOR_PORT_ADDR);
- if(portVal != portValPrev)
- {
- memset(charBuf, 0, sizeof(charBuf));
- sprintf(charBuf, "PERIPHERAL:JOURNALPRINTER: portVal=%#x, Sensor=%d, Motor=%d\n", portVal, (portVal & 0x04) >> 2, portVal & 0x01);
- debug_log(charBuf, DEBUG_LOG);
- portValPrev = portVal;
- }
- portVal = JP_SENSOR_VALUE(portVal);
- return portVal;
- }
- void jp_rewindMotorCtrl(uint8_t option)
- {
- uint8_t portVal = 0;
- portVal = par_pinStatus(JP_MOTOR_PORT_ADDR);
- if(option == JP_MOTOR_START)
- portVal |= JP_MOTOR_CTRL_BIT;
- else if(option == JP_MOTOR_STOP)
- portVal &= ~JP_MOTOR_CTRL_BIT;
- par_pinWrite(portVal, JP_MOTOR_PORT_ADDR);
- }
- int main(int argc,char *argv[])
- {
- unsigned int jpSensorValue = 0;
- int type = atoi(argv[1]);
- char debugBuf[1024] = {'\0'};
- int parallelFd = ppi_open("/dev/parport0");
- printf("Type: %d", type);
- jp_rewindMotorCtrl(type);
- jpSensorValue = jp_readSensorVal();
- if(jpSensorValue == JP_SENSOR_CLEAR)
- {
- memset(debugBuf,0,sizeof(debugBuf));
- sprintf(debugBuf,"SYSTEM: JP Sensor Clear: %d", jpSensorValue);
- debug_log(debugBuf,TRACE_LOG);
- }
- else
- {
- memset(debugBuf,0,sizeof(debugBuf));
- sprintf(debugBuf,"SYSTEM: JP Sensor Block: %d", jpSensorValue);
- debug_log(debugBuf,TRACE_LOG);
- }
- printf("\n");
- ppi_close(parallelFd);
- return 0;
- }
Add Comment
Please, Sign In to add comment