Changeset 1975 for branches/modular/csctapi/io_serial.c
- Timestamp:
- 04/06/10 17:45:45 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/modular/csctapi/io_serial.c
r1832 r1975 60 60 static int IO_Serial_Bitrate(int bitrate); 61 61 62 static bool IO_Serial_WaitToRead ( unsigned delay_ms, unsigned timeout_ms);63 64 static bool IO_Serial_WaitToWrite ( unsigned delay_ms, unsigned timeout_ms);62 static bool IO_Serial_WaitToRead (struct s_reader * reader, unsigned delay_ms, unsigned timeout_ms); 63 64 static bool IO_Serial_WaitToWrite (struct s_reader * reader, unsigned delay_ms, unsigned timeout_ms); 65 65 66 66 static int _in_echo_read = 0; … … 70 70 71 71 #if defined(TUXBOX) && defined(PPC) 72 void IO_Serial_Ioctl_Lock( int flag)72 void IO_Serial_Ioctl_Lock(struct s_reader * reader, int flag) 73 73 { 74 74 extern int *oscam_sem; 75 if ((reader [ridx].typ != R_DB2COM1) && (reader[ridx].typ != R_DB2COM2)) return;75 if ((reader->typ != R_DB2COM1) && (reader->typ != R_DB2COM2)) return; 76 76 if (!flag) 77 77 *oscam_sem=0; 78 else while (*oscam_sem!=reader [ridx].typ)78 else while (*oscam_sem!=reader->typ) 79 79 { 80 80 while (*oscam_sem) 81 if (reader [ridx].typ == R_DB2COM1)81 if (reader->typ == R_DB2COM1) 82 82 cs_sleepms(6); 83 83 else 84 84 cs_sleepms(8); 85 *oscam_sem=reader [ridx].typ;85 *oscam_sem=reader->typ; 86 86 cs_sleepms(1); 87 87 } … … 127 127 #endif 128 128 129 bool IO_Serial_DTR_RTS( int dtr, int set)129 bool IO_Serial_DTR_RTS(struct s_reader * reader, int dtr, int set) 130 130 { 131 131 unsigned int msr; … … 133 133 134 134 #if defined(TUXBOX) && defined(PPC) 135 if ((reader [ridx].typ == R_DB2COM1) || (reader[ridx].typ == R_DB2COM2))136 return(IO_Serial_DTR_RTS_dbox2(reader [ridx].typ == R_DB2COM2, dtr, set));135 if ((reader->typ == R_DB2COM1) || (reader->typ == R_DB2COM2)) 136 return(IO_Serial_DTR_RTS_dbox2(reader->typ == R_DB2COM2, dtr, set)); 137 137 #endif 138 138 139 139 mbit=(dtr) ? TIOCM_DTR : TIOCM_RTS; 140 140 #if defined(TIOCMBIS) && defined(TIOBMBIC) 141 if (ioctl (reader [ridx].handle, set ? TIOCMBIS : TIOCMBIC, &mbit) < 0)141 if (ioctl (reader->handle, set ? TIOCMBIS : TIOCMBIC, &mbit) < 0) 142 142 return ERROR; 143 143 #else 144 if (ioctl(reader [ridx].handle, TIOCMGET, &msr) < 0)144 if (ioctl(reader->handle, TIOCMGET, &msr) < 0) 145 145 return ERROR; 146 146 if (set) … … 148 148 else 149 149 msr&=~mbit; 150 if (ioctl(reader [ridx].handle, TIOCMSET, &msr)<0)150 if (ioctl(reader->handle, TIOCMSET, &msr)<0) 151 151 return ERROR; 152 152 return OK; … … 158 158 */ 159 159 160 bool IO_Serial_SetBitrate ( unsigned long bitrate, struct termios * tio)160 bool IO_Serial_SetBitrate (struct s_reader * reader, unsigned long bitrate, struct termios * tio) 161 161 { 162 162 /* Set the bitrate */ 163 163 #ifdef OS_LINUX 164 164 //FIXME workaround for Smargo until native mode works 165 if ((reader [ridx].mhz == reader[ridx].cardmhz) && (reader[ridx].smargopatch != 1))165 if ((reader->mhz == reader->cardmhz) && (reader->smargopatch != 1)) 166 166 #endif 167 167 { //no overcloking 168 168 cfsetospeed(tio, IO_Serial_Bitrate(bitrate)); 169 169 cfsetispeed(tio, IO_Serial_Bitrate(bitrate)); 170 cs_debug("standard baudrate: cardmhz=%d mhz=%d -> effective baudrate %lu", reader [ridx].cardmhz, reader[ridx].mhz, bitrate);170 cs_debug("standard baudrate: cardmhz=%d mhz=%d -> effective baudrate %lu", reader->cardmhz, reader->mhz, bitrate); 171 171 } 172 172 #ifdef OS_LINUX … … 174 174 /* these structures are only available on linux as fas as we know so limit this code to OS_LINUX */ 175 175 struct serial_struct nuts; 176 ioctl(reader [ridx].handle, TIOCGSERIAL, &nuts);177 int custom_baud_asked = bitrate * reader [ridx].mhz / reader[ridx].cardmhz;176 ioctl(reader->handle, TIOCGSERIAL, &nuts); 177 int custom_baud_asked = bitrate * reader->mhz / reader->cardmhz; 178 178 nuts.custom_divisor = (nuts.baud_base + (custom_baud_asked/2))/ custom_baud_asked; 179 179 int custom_baud_delivered = nuts.baud_base / nuts.custom_divisor; 180 180 cs_debug("custom baudrate: cardmhz=%d mhz=%d custom_baud=%d baud_base=%d divisor=%d -> effective baudrate %d", 181 reader [ridx].cardmhz, reader[ridx].mhz, custom_baud_asked, nuts.baud_base, nuts.custom_divisor, custom_baud_delivered);181 reader->cardmhz, reader->mhz, custom_baud_asked, nuts.baud_base, nuts.custom_divisor, custom_baud_delivered); 182 182 int baud_diff = custom_baud_delivered - custom_baud_asked; 183 183 if (baud_diff < 0) … … 191 191 nuts.flags &= ~ASYNC_SPD_MASK; 192 192 nuts.flags |= ASYNC_SPD_CUST; 193 ioctl(reader [ridx].handle, TIOCSSERIAL, &nuts);193 ioctl(reader->handle, TIOCSSERIAL, &nuts); 194 194 cfsetospeed(tio, IO_Serial_Bitrate(38400)); 195 195 cfsetispeed(tio, IO_Serial_Bitrate(38400)); … … 199 199 } 200 200 201 bool IO_Serial_SetParams ( unsigned long bitrate, unsigned bits, int parity, unsigned stopbits, int dtr, int rts)201 bool IO_Serial_SetParams (struct s_reader * reader, unsigned long bitrate, unsigned bits, int parity, unsigned stopbits, int dtr, int rts) 202 202 { 203 203 struct termios newtio; 204 204 205 if(reader [ridx].typ == R_INTERNAL)205 if(reader->typ == R_INTERNAL) 206 206 return ERROR; 207 207 208 208 memset (&newtio, 0, sizeof (newtio)); 209 209 210 if (IO_Serial_SetBitrate ( bitrate, & newtio))210 if (IO_Serial_SetBitrate (reader, bitrate, & newtio)) 211 211 return ERROR; 212 212 … … 274 274 newtio.c_cc[VTIME] = 0; 275 275 276 if (IO_Serial_SetProperties(newtio)) 277 return ERROR; 278 279 current_baudrate = bitrate; 280 281 IO_Serial_Ioctl_Lock(1); 282 IO_Serial_DTR_RTS(0, rts == IO_SERIAL_HIGH); 283 IO_Serial_DTR_RTS(1, dtr == IO_SERIAL_HIGH); 284 IO_Serial_Ioctl_Lock(0); 285 286 return OK; 287 } 288 289 bool IO_Serial_SetProperties (struct termios newtio) 290 { 291 if(reader[ridx].typ == R_INTERNAL) 276 if (IO_Serial_SetProperties(reader, newtio)) 277 return ERROR; 278 279 reader->current_baudrate = bitrate; 280 281 IO_Serial_Ioctl_Lock(reader, 1); 282 IO_Serial_DTR_RTS(reader, 0, rts == IO_SERIAL_HIGH); 283 IO_Serial_DTR_RTS(reader, 1, dtr == IO_SERIAL_HIGH); 284 IO_Serial_Ioctl_Lock(reader, 0); 285 return OK; 286 } 287 288 bool IO_Serial_SetProperties (struct s_reader * reader, struct termios newtio) 289 { 290 if(reader->typ == R_INTERNAL) 292 291 return ERROR; 293 292 294 if (tcsetattr (reader [ridx].handle, TCSANOW, &newtio) < 0)295 return ERROR; 296 // tcflush(reader [ridx].handle, TCIOFLUSH);297 // if (tcsetattr (reader [ridx].handle, TCSAFLUSH, &newtio) < 0)293 if (tcsetattr (reader->handle, TCSANOW, &newtio) < 0) 294 return ERROR; 295 // tcflush(reader->handle, TCIOFLUSH); 296 // if (tcsetattr (reader->handle, TCSAFLUSH, &newtio) < 0) 298 297 // return ERROR; 299 298 … … 304 303 } 305 304 else 306 cs_log("WARNING: Failed to reset reader %s", reader [ridx].label);305 cs_log("WARNING: Failed to reset reader %s", reader->label); 307 306 308 307 cs_debug("IO: Setting properties\n"); … … 310 309 } 311 310 312 int IO_Serial_SetParity ( BYTE parity)313 { 314 if(reader [ridx].typ == R_INTERNAL)311 int IO_Serial_SetParity (struct s_reader * reader, BYTE parity) 312 { 313 if(reader->typ == R_INTERNAL) 315 314 return OK; 316 315 … … 321 320 int current_parity; 322 321 // Get current parity 323 if (tcgetattr (reader [ridx].handle, &tio) != 0)322 if (tcgetattr (reader->handle, &tio) != 0) 324 323 return ERROR; 325 324 … … 364 363 break; 365 364 } 366 if (IO_Serial_SetProperties ( tio))365 if (IO_Serial_SetProperties (reader, tio)) 367 366 return ERROR; 368 367 } … … 371 370 } 372 371 373 void IO_Serial_Flush ( )372 void IO_Serial_Flush (struct s_reader * reader) 374 373 { 375 374 BYTE b; 376 while(!IO_Serial_Read( 1000, 1, &b));377 } 378 379 380 bool IO_Serial_Read ( unsigned timeout, unsigned size, BYTE * data)375 while(!IO_Serial_Read(reader, 1000, 1, &b)); //FIXME how about tcflush?? 376 } 377 378 379 bool IO_Serial_Read (struct s_reader * reader, unsigned timeout, unsigned size, BYTE * data) 381 380 { 382 381 BYTE c; … … 387 386 #endif 388 387 389 if((reader [ridx].typ != R_INTERNAL) && (wr>0))388 if((reader->typ != R_INTERNAL) && (reader->written>0)) 390 389 { 391 390 BYTE buf[256]; 392 int n = wr;393 wr= 0;394 395 if(IO_Serial_Read ( timeout, n, buf))391 int n = reader->written; 392 reader->written = 0; 393 394 if(IO_Serial_Read (reader, timeout, n, buf)) 396 395 return ERROR; 397 396 } … … 406 405 while( (((tv_spent.tv_sec-tv.tv_sec)*1000) + ((tv_spent.tv_usec-tv.tv_usec)/1000L))<timeout ) 407 406 { 408 if (read (reader [ridx].handle, &c, 1) == 1)407 if (read (reader->handle, &c, 1) == 1) 409 408 { 410 409 readed=TRUE; … … 418 417 cs_debug_nolf ("%02X ", c); 419 418 #else 420 if (!IO_Serial_WaitToRead ( 0, timeout))419 if (!IO_Serial_WaitToRead (reader, 0, timeout)) 421 420 { 422 if (read (reader [ridx].handle, &c, 1) != 1)421 if (read (reader->handle, &c, 1) != 1) 423 422 { 424 423 cs_debug_nolf ("ERROR\n"); … … 431 430 { 432 431 cs_debug_nolf ("TIMEOUT\n"); 433 tcflush (reader [ridx].handle, TCIFLUSH);432 tcflush (reader->handle, TCIFLUSH); 434 433 return ERROR; 435 434 } … … 441 440 } 442 441 443 bool IO_Serial_Write ( unsigned delay, unsigned size, BYTE * data)442 bool IO_Serial_Write (struct s_reader * reader, unsigned delay, unsigned size, BYTE * data) 444 443 { 445 444 unsigned count, to_send, i_w; … … 447 446 448 447 /* Discard input data from previous commands */ 449 // tcflush (reader [ridx].handle, TCIFLUSH);448 // tcflush (reader->handle, TCIFLUSH); 450 449 451 450 for (count = 0; count < size; count += to_send) 452 451 { 453 // if(reader [ridx].typ == R_INTERNAL)452 // if(reader->typ == R_INTERNAL) 454 453 // to_send = 1; 455 454 // else 456 455 to_send = (delay? 1: size); 457 456 458 if (!IO_Serial_WaitToWrite ( delay, 1000))457 if (!IO_Serial_WaitToWrite (reader, delay, 1000)) 459 458 { 460 459 for (i_w=0; i_w < to_send; i_w++) { … … 464 463 } 465 464 } 466 unsigned int u = write (reader [ridx].handle, data_w, (1+io_serial_need_dummy_char)*to_send);465 unsigned int u = write (reader->handle, data_w, (1+io_serial_need_dummy_char)*to_send); 467 466 _in_echo_read = 1; 468 467 if (u != (1+io_serial_need_dummy_char)*to_send) 469 468 { 470 469 cs_debug ("ERROR\n"); 471 if(reader [ridx].typ != R_INTERNAL)472 wr+= u;470 if(reader->typ != R_INTERNAL) 471 reader->written += u; 473 472 return ERROR; 474 473 } 475 474 476 if(reader [ridx].typ != R_INTERNAL)477 wr+= to_send;475 if(reader->typ != R_INTERNAL) 476 reader->written += to_send; 478 477 479 478 cs_ddump (data_w+count, (1+io_serial_need_dummy_char)*to_send, "IO: Sending: "); … … 482 481 { 483 482 cs_debug ("TIMEOUT\n"); 484 // tcflush (reader [ridx].handle, TCIFLUSH);483 // tcflush (reader->handle, TCIFLUSH); 485 484 return ERROR; 486 485 } … … 489 488 } 490 489 491 bool IO_Serial_Close ( )492 { 493 494 cs_debug ("IO: Clossing serial port %s\n", reader [ridx].device);490 bool IO_Serial_Close (struct s_reader * reader) 491 { 492 493 cs_debug ("IO: Clossing serial port %s\n", reader->device); 495 494 496 495 #if defined(TUXBOX) && defined(PPC) 497 496 close(fdmc); 498 497 #endif 499 if (close (reader [ridx].handle) != 0)500 return ERROR; 501 502 wr= 0;498 if (close (reader->handle) != 0) 499 return ERROR; 500 501 reader->written = 0; 503 502 504 503 return OK; … … 571 570 } 572 571 573 static bool IO_Serial_WaitToRead ( unsigned delay_ms, unsigned timeout_ms)572 static bool IO_Serial_WaitToRead (struct s_reader * reader, unsigned delay_ms, unsigned timeout_ms) 574 573 { 575 574 fd_set rfds; … … 582 581 cs_sleepms (delay_ms); 583 582 584 in_fd=reader [ridx].handle;583 in_fd=reader->handle; 585 584 586 585 FD_ZERO(&rfds); … … 595 594 if(select_ret==-1) 596 595 { 597 596 cs_log("ERROR in IO_Serial_WaitToRead: select_ret=%i, errno=%d", select_ret, errno); 598 597 return ERROR; 599 598 } … … 601 600 if (FD_ISSET(in_fd, &erfds)) 602 601 { 603 602 cs_log("ERROR in IO_Serial_WaitToRead: fd is in error fds, errno=%d", errno); 604 603 return ERROR; 605 604 } … … 610 609 } 611 610 612 static bool IO_Serial_WaitToWrite ( unsigned delay_ms, unsigned timeout_ms)611 static bool IO_Serial_WaitToWrite (struct s_reader * reader, unsigned delay_ms, unsigned timeout_ms) 613 612 { 614 613 fd_set wfds; … … 619 618 620 619 #ifdef SCI_DEV 621 if(reader [ridx].typ == R_INTERNAL)620 if(reader->typ == R_INTERNAL) 622 621 return OK; 623 622 #endif … … 626 625 cs_sleepms(delay_ms); 627 626 628 out_fd=reader [ridx].handle;627 out_fd=reader->handle; 629 628 630 629 FD_ZERO(&wfds); … … 661 660 } 662 661 663 bool IO_Serial_InitPnP ( )662 bool IO_Serial_InitPnP (struct s_reader * reader) 664 663 { 665 664 unsigned int PnP_id_size = 0; 666 665 BYTE PnP_id[IO_SERIAL_PNPID_SIZE]; /* PnP Id of the serial device */ 667 666 668 if (IO_Serial_SetParams ( 1200, 7, PARITY_NONE, 1, IO_SERIAL_HIGH, IO_SERIAL_LOW))669 return ERROR; 670 671 while ((PnP_id_size < IO_SERIAL_PNPID_SIZE) && !IO_Serial_Read ( 200, 1, &(PnP_id[PnP_id_size])))667 if (IO_Serial_SetParams (reader, 1200, 7, PARITY_NONE, 1, IO_SERIAL_HIGH, IO_SERIAL_LOW)) 668 return ERROR; 669 670 while ((PnP_id_size < IO_SERIAL_PNPID_SIZE) && !IO_Serial_Read (reader, 200, 1, &(PnP_id[PnP_id_size]))) 672 671 PnP_id_size++; 673 672
Note:
See TracChangeset
for help on using the changeset viewer.