Please help with a question.
I'm trying to resolve programm example for parport loopback wtire/read.
While reading program skip first 6 symbols due to select timeoutand I can't understand what to do in that situation.
How to trace what is hold function and how to fix it.
Thanks.
Some profile data:
Kernel: Linux pc-Cantiga-ICH9M-Chipset 5.4.0-33-generic Ubuntu: bullseye/sid Compiler: gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0
Write to port
# write.c#include "testlpt.h"#include <sys/types.h>/* example how to write data */void *write_data() {unsigned char status='\0'; for(int i=0;i<SIZE_BUF;i++) { int mode=0xFF;int res=ioctl(fd, PPDATADIR, &mode); fprintf(stdout,"Data= %c\n",data);#if 1#endifcounter=counter+0; res=ioctl(fd, PPWDATA, &data); if (res < 0) { fprintf(stdout,"Error write (%d)(%s)\n",errno,strerror(errno)); break; } data++; usleep(USLEEP); } int res=ioctl(fd, PPRELEASE); if (res < 0 ){fprintf(stdout,"Release error \n"); }pthread_exit(0);}/* example how to read the status lines. */int status_pins(int fd){ unsigned char val; int res=ioctl(fd, PPRSTATUS, &val); if (res <0){ fprintf(stdout,"PPRSTATUS ERROR res = %d\n",res); return -1; }// val ^= PARPORT_STATUS_BUSY; /* /BUSY needs to get inverted */fprintf(stdout,"ERROR = 0x%02x \n", (val & (PARPORT_STATUS_ERROR | PARPORT_STATUS_BUSY))); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);fprintf(stdout,"BUSY = 0x%02x \n", (val & PARPORT_STATUS_BUSY)); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);fprintf(stdout,"SELECT = 0x%02x \n", (val & PARPORT_STATUS_SELECT)); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);fprintf(stdout,"ACK = 0x%02x \n", (val & PARPORT_STATUS_ACK)); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);}
Header
# testlpt.h#ifndef _TESTLPT_H#define _TESTLPT_H#include <stdio.h>#include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h>#include <linux/parport.h>#include <linux/ppdev.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <signal.h>#include <sys/io.h>#include <errno.h>#include <error.h>#include <string.h> #define DEVICE "/dev/parport0"#define SIZE_BUF 26#define USLEEP 1000#define TIMEOUT 1#include <poll.h>#include <sys/epoll.h>void *reads_data();void *write_data();int claim_port ();int port_select(int fd);extern int fd;extern unsigned char data;extern int counter;static pthread_mutex_t lock;#endif /* testlpt.h */
Read from port
/* read.c */#include <sys/select.h>#include "testlpt.h"void *reads_data() {unsigned char data;data='\0';int res=0;fd_set rfds;counter =0;for(;;) {struct timeval tv; tv.tv_sec = 0;tv.tv_usec = 100;errno =0;FD_ZERO(&rfds);FD_SET(fd, &rfds);#if 1 int mode=0x00; res=ioctl(fd, PPDATADIR, &mode); res=select (fd + 1, &rfds, (fd_set *)NULL, (fd_set *)NULL, &tv); fprintf(stdout,"res select = %d counter = %d \n",res,counter); if( res== -1 ) { fprintf(stdout,"End Read by select \n"); continue; } else if (res == 0){ fprintf(stdout,"Select timeout\n"); } else { counter++; if ( FD_ISSET(fd , &rfds ) ) { res=ioctl(fd, PPRDATA, &data); /* now fetch the data! */ if (res < 0) { fprintf(stdout,"End Read by end of array\n"); break; } } }#endif fflush(stdout); usleep(USLEEP); if (( data > 0x40 ) && ( data < 0x5B)) { fprintf(stdout,"counter = %d data = %c\n",counter,data); }counter++;}FD_ZERO(&rfds); fprintf(stdout,"End Read\n");pthread_exit(0);}
Main function
#include <testlpt.h>int fd;unsigned char data=0x41;int counter=0;int main(int argc, char **argv){ pthread_t id[1]; pthread_attr_t attr; if ((fd=open(DEVICE, O_RDWR | O_NOCTTY )) < 0) { fprintf(stderr, "can not open %s\n", DEVICE); return 5; } int mode = IEEE1284_MODE_COMPAT; int res=ioctl(fd, PPSETMODE, &mode); if( res== -1 ) { fprintf(stdout,"PPSETMODE ERROR\n"); }unsigned int modes; res=ioctl(fd, PPGETMODE, &modes); if( res ==0 ) { fprintf(stdout,"MODES= 0x%02x\n", modes); }#if 1 while (claim_port() <0 ){fprintf (stdout,"Claimt port error = %d\n",0);sleep(1);continue;}#endifpthread_attr_init(&attr);pthread_mutex_init(&lock, NULL);#if 1 if (pthread_create(&id[0],0,&write_data,NULL)){perror("pthread create error!"); } if (pthread_create(&id[1],0,&reads_data,NULL)){perror("pthread create error!"); }if (pthread_join(id[0],NULL)) { perror("pthread exit error!"); }if (pthread_join(id[1],NULL)) { perror("pthread exit error!"); } ioctl(fd, PPRELEASE); close(fd); exit(EXIT_SUCCESS);#endif}int claim_port() { if (ioctl(fd, PPCLAIM) < 0) {// if (ioctl(fd, PPEXCL) < 0) { int errsv = errno; fprintf(stdout,"CLAIM errno %s \n",strerror(errsv)); close(fd); return -1; } return 0;}
Program output
Data= AData= BSelect timeoutData= CSelect timeoutData= DSelect timeoutData= ESelect timeoutData= FSelect timeoutData= GSelect timeoutData= HData= IData= Jcounter = 7 data = IData= Kcounter = 9 data = JData= Lcounter = 11 data = KData= Mcounter = 13 data = LData= Ncounter = 15 data = Mcounter = 17 data = NData= Ocounter = 19 data = NData= Pcounter = 21 data = OData= Qcounter = 23 data = PData= RData= Scounter = 25 data = QData= Tcounter = 27 data = SData= Ucounter = 29 data = TData= Vcounter = 31 data = UData= Wcounter = 33 data = VData= Xcounter = 35 data = Wcounter = 37 data = XData= YData= Zcounter = 39 data = Xcounter = 41 data = Z